По причинам, связанным с бизнесом, я создал следующее 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
, поэтому я получаю «Веб-страница привела к слишком большому количеству перенаправлений» ошибки из браузеров.
Я долго занимался исследованиями и не нашел «хороших» решений. Что я пробовал:
Используйте флаг [END] . К сожалению, он недоступен в моей версии 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 редирект. И как указано в документации, на которую вы ссылаетесь ...
Это не относится к новым запросам, возникающим в результате внешних перенаправлений.