Может кто-нибудь объяснить это странное поведение регулярных выражений mod_rewrite - PullRequest
2 голосов
/ 26 октября 2010

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

Запрошенный URL: http://myurl.com/path/to/something

.htaccess имеет: RewriteRule to where

Используя мою систему отладки, при использовании этого RewriteRule происходит следующее:

path/to/something -> where/to/something

Разве это не должно быть path/where/something ???

Вот полный файл .htaccess

RewriteEngine On

RewriteBase / ModRewriteTester

RewriteRule. * - [E = ORIG: $ 0]

RewriteRule куда

RewriteRule. * - [E = MODD: $ 0]

RewriteRule. * Index.php

Затем у меня есть php-скрипт, который читает переменные окружения $_SERVER['REDIRECT_ORIG'] и $_SERVER['REDIRECT_MODD'], вот где я получаю ранее указанные пути.

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

1 Ответ

1 голос
/ 26 октября 2010

Ваше правило:

RewriteRule to where

... перезапишет URL-адрес, соответствующий - , и заменит его URL-адресом, представляющим запрос на / где . При определенных обстоятельствах mod_rewrite может попытаться повторно добавить то, что Apache считает PATH_INFO , что может создать ситуацию, подобную следующей:

path/to/somewhere  -> PATH_INFO = /to/somewhere
path/to/somewhere  -> /where
(append PATH_INFO) -> /where/to/somewhere

Чтобы проверить, так ли это в вашем сценарии, вы можете добавить флаг DPI к RewriteRule, чтобы отбросить PATH_INFO, если он существует. Это будет выглядеть так:

RewriteRule to where [DPI]

В этом случае вы получите только URL /, где . Если вы хотите заменить на на , где , сохраняя при этом оставшуюся часть URL, вам потребуется правило, похожее на это:

RewriteRule (.*?/)?to(/.*)? $1where$2

Что касается отладки вашего набора правил, если у вас есть доступ к конфигурации Apache, вам гораздо лучше использовать директиву RewriteLog с достаточно высоким RewriteLogLevel. Если у вас нет доступа к конфигурации, вы в значительной степени ограничены тем, что делаете что-то похожее на то, что вы пытаетесь сделать сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...