Как имитировать флаг Apache [END] при перенаправлении?

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

Я долго занимался исследованиями и не нашел «хороших» решений. Что я пробовал:

  1. Используйте флаг [END] . К сожалению, он недоступен в моей версии Apache и не работает с перенаправлениями.

  2. Используйте % {ENV: REDIRECT_STATUS} в предложении RewriteCond , чтобы завершить процесс перезаписи (L). По какой-то причине % {ENV: REDIRECT_STATUS} все время пусто.

  3. Добавьте заголовок ответа с предложением Header, если мое правило соответствует, а затем проверьте этот заголовок (подробности см. здесь ). Кажется, что а) REDIRECT_addHeader пуст б) заголовки не могут быть явно установлены в ответе 301.

Есть еще одна альтернатива. Я мог бы установить параметр запроса для URL-адреса перенаправления, который указывает, что он исходит от перенаправления, но мне не нравится это решение, поскольку оно кажется слишком хакерским.

Есть ли способ сделать то же самое, что и флаг [END] , но в более старых версиях Apache? Такие как у меня 2.2.22.

1
задан 6 November 2019 в 03:12
2 ответа

Лучше всего добавить параметр запроса в перенаправление. Это делается довольно часто по разным причинам.

Например, создайте такое правило:

RewriteCond %{QUERY_STRING}  !redirected
RewriteRule /site/(\d+)/([^/]+)\.html /site/$2/$1?redirected [R=301,L]

Теперь происходит перенаправление на URL-адреса с добавленным к ним «? Redirected». Так что второй раз правило не применяется.

2
ответ дан 3 December 2019 в 18:52

Флаг [END] здесь не имеет значения, поскольку вы обслуживаете 301 редирект. И как указано в документации, на которую вы ссылаетесь ...

Это не относится к новым запросам, возникающим в результате внешних перенаправлений.

1
ответ дан 3 December 2019 в 18:52

Теги

Похожие вопросы