.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 не имеет отдельных «условий». Вместо этого мы используем негативный прогноз в универсальном правиле, чтобы создать исключение.

Другие вопросы по тегам