Назад | Перейти на главную страницу

Как смоделировать флаг 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. Использовать [КОНЕЦ] флаг. К сожалению, он недоступен в моей версии Apache и не работает с перенаправлениями.

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

  3. Добавьте заголовок ответа с предложением 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-адресов.