По причинам, связанным с бизнесом, я создал следующие RewriteRule
для Apache 2.2.22 (mod_rewrite):
RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1 [R=301,L]
Что, если дать URL-адрес, например:
http://www.example.com/site/0999/document.html
Переводится на:
http://www.example.com/site/document/0999.html
Это ожидаемый сценарий. Однако есть документы, в названии которых есть только цифры. Итак, рассмотрим следующий случай:
http://www.example.com/site/0055/0666.html
Переводится на:
http://www.example.com/site/0666/0055.html
Что также соответствует моему RewriteRule
шаблон, поэтому я получаю «Веб-страница привела к слишком большому количеству переадресаций» ошибки из браузеров.
Я долго занимался поиском и не нашел "хороших" решений. Что я пробовал:
Использовать [КОНЕЦ] флаг. К сожалению, он недоступен в моей версии Apache и не работает с перенаправлениями.
Использовать %{ENV:REDIRECT_STATUS}
на RewriteCond
пункт, чтобы завершить процесс перезаписи (L). По какой-то причине %{ENV:REDIRECT_STATUS}
все время пусто.
Добавьте заголовок ответа с предложением Header, если мое правило соответствует, а затем проверьте этот заголовок (см .: здесь для подробностей). Кажется, что а) REDIRECT_addHeader пуст б) заголовки не могут быть явно установлены в ответе 301.
Есть еще одна альтернатива. Я мог бы установить параметр запроса для URL-адреса перенаправления, который указывает, что он исходит от перенаправления, но мне не нравится это решение, поскольку оно кажется слишком хакерским.
Есть ли способ сделать именно то, что [END]
флаг есть, но в более старых версиях Apache? Такие как у меня 2.2.22.
Лучше всего добавить параметр запроса в редирект. Это делается довольно часто по разным причинам.
Например, составьте такое правило:
RewriteCond %{QUERY_STRING} !redirected
RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1?redirected [R=301,L]
Теперь происходит перенаправление на URL-адреса, к которым добавлено «? Redirected». Так что второй раз правило не применяется.
Флаг [END] здесь не актуален, поскольку вы обслуживаете 301 редирект. И поскольку документация, с которой вы связались, заявляет ...
Это не относится к новым запросам, возникающим в результате внешних перенаправлений.
Если вам действительно нужно выполнить такое перенаправление, вам нужно найти другой способ устранить неоднозначность старых и новых URL-адресов.