.htaccess — перенаправить все URL-адреса, за одним исключением.
Я хочу перенаправить все URL-адреса с одного домена на другой. Некоторые из старых URL-адресов имеют новые аналоги с конкретными страницами, на которые можно перенаправить. Все остальные URL-адреса должны перенаправляться на домашнюю страницу нового домена.
Но я не хочу перенаправлятьsitemap.xml
. Поэтому я сделал такое исключение (отсюда):
RewriteCond %{REQUEST_URI} !^/sitemap.xml?$
Но это не работает.
Вот мой полный код:
RewriteEngine on
# exception for the sitemap:
RewriteCond %{REQUEST_URI} !^/sitemap.xml?$
# specific redirects:
Redirect 301 /old-page https://www.new-domain.com/
# catch the rest:
RedirectMatch 301 ^/ https://www.new-domain.com/
Здесь что-то не так?
2 ответа
Поскольку mod_alias рекомендуется для простых перенаправлений , вот решение с mod_alias:
# Specific redirects:
Redirect 301 /old-prefix https://www.example.com/
Redirect 301 /another-old-prefix/ https://www.example.com/path/
# Catch the rest, except the sitemap:
RedirectMatch 301 ^/(?!sitemap\.xml$).* https://www.example.com/
Основное функциональное отличие отRedirect
заключается в том, что он перенаправляет все с одним и тем же префиксом.
Тогда любой запрос, начинающийся с URL-path, будет возвращать клиенту запрос на перенаправление по расположению целевого URL-адреса. Дополнительная информация о пути помимо соответствующего URL-пути будет добавлена к целевому URL-адресу.
Вы смешиваете mod_rewrite(,) и mod_alias(Redirect
,RedirectMatch
). Случайная директива mod_rewrite здесь ничего не сделает. Эта директива применяется только к следующей директиве.
Следовательно,RewriteEngine
это mod_rewrite и не имеет ничего общего с mod_alias.
Здесь вы можете использовать любой из них, но не оба, так как вы можете получить неожиданные конфликты из-за порядка обработки.
Использование mod_rewrite:
RewriteEngine on
# Specific redirects:
RewriteRule ^old-page$ https://www.new-domain.com/new-page [R=301,L]
# Catch the rest, except the sitemap:
RewriteRule !^sitemap\.xml$ https://www.new-domain.com/ [R=301,L]
Обратите внимание, что URL-путь, соответствующийRewriteRule
шаблон не начинается с косой черты.
Вам не нужно отдельное условие (RewriteCond
директива), если вы хотите сделать исключение только для одного URL-адреса.
Перед тестированием вам необходимо будет очистить кеш браузера, поскольку перенаправление 301 (постоянное) будет кэшировано браузером (и, возможно, промежуточными кешами). Протестируйте перенаправление 302 (временное), чтобы избежать потенциальных проблем с кешированием.
Примечание: перенаправление оставшихся URL-адресов на домашнюю страницу в новом домене часто вредно для SEO и пользователей. Как правило, лучше использовать собственный код 404 с содержательным сообщением для пользователей. При перенаправлении на домашнюю страницу эти страницы будут оставаться в результатах поиска дольше, но в конечном итоге поисковые системы (включая Google) будут рассматривать их как soft-404. Пользователи остаются в замешательстве, когда попадают на страницу, которую не ожидали, и просто отказываются.
Альтернативно, используя mod_alias:
# Specific redirects:
Redirect 301 /old-page https://www.new-domain.com/new-page
# Catch the rest, except the sitemap:
RedirectMatch 301 ^/(?!sitemap\.xml).* https://www.new-domain.com/
Обратите внимание, что mod_alias не имеет отдельных «условий». Вместо этого мы используем негативный прогноз в универсальном правиле, чтобы создать исключение.