Mod_rewrite повторение - PullRequest
       5

Mod_rewrite повторение

0 голосов
/ 26 февраля 2009

Я работаю над сайтом, на котором все PHP-скрипты проходят через одну PHP-страницу (passthrough.php).

.htaccess файл предполагается , чтобы взять определенные специальные каталоги и преобразовать их в переменные GET, чтобы скрипт контроллера знал, что с ними делать. Итак:

http://example.com/ajax/method.php 

становится

http://example.com/passthrough.php?path=method.php&mode=ajax

и

http://example.com/ajax/json/method.php 

становится

http://example.com/passthrough.php?path=method.php&mode=ajax&output=json

И так далее. Вот что у меня в файле .htaccess:

RewriteRule ajax/(.*)$ $1?mode=ajax [QSA]
RewriteRule (xml|json)/(.*)$ $2?output=$1 [QSA]

RewriteRule (.*)\.php$ passthrough.php?path=$1 [QSA]
RewriteRule passthrough.php - [L]

Во втором примере mod_rewrite выполняет правило ajax, а затем выглядит так, как будто выполняется правило passthrough.php. Затем он пытается запустить процесс перезаписи. Теперь правило ajax не подходит, но правило вывода подходит, так что оно применяется, и затем URL снова переписывается правилом passthrough.php, что приводит к следующим переменным GET:

путь: method.php / json / method.php / json / method вывод: JSON режим: ajax

У меня такой вопрос: есть ли способ заставить механизм перезаписи обрабатывать весь URL за один раз? поэтому URL-адрес приходит в виде /ajax/json/method.php, становится /json/method.php?mode=ajax, затем /method.php?mode=ajax&output=json, затем /passthrough.php?mode=ajax&output=json&path = метод, все за один раз? Кажется, что он запускается через .htaccess один раз для каждого сопоставляемого правила, вместо анализа URL-адреса, изменения в зависимости от следующего правила, изменения в зависимости от следующего правила и т. Д.

Я пытался использовать несколько флагов, включая [PT] и [S], но они плохо документированы. Эту проблему можно решить, написав особые условия, которые передают код непосредственно в сценарий сквозного прохождения, но это не очень хорошо решено и не кажется мне правильным.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2009

Честно говоря, я думаю, что вы не правы, когда говорите, что передаете PATH_INFO в passthrough.php и анализируете его в своем скрипте. Вы настраиваете себя на кошмар обслуживания с помощью (ab), используя mod_rewrite таким, какой вы есть.

0 голосов
/ 26 февраля 2009

Попробуйте это:

RewriteRule ^passthrough\.php$ - [L]
RewriteRule !\.php$ - [L]
RewriteRule ^ajax/(.*) passthrough.php?path=$1&mode=ajax [L,QSA]
RewriteRule ^(xml|json)/(.*) passthrough.php?path=$2&output=$1 [L,QSA]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...