RewriteRule быть жадным - PullRequest
       7

RewriteRule быть жадным

0 голосов
/ 20 апреля 2010

Я искал ответ уже несколько часов, так что извините, если об этом спрашивали много раз, я его пропустил.

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

RewriteRule ^([a-z]+)?/(.+)$ $2 [L]

это работает, если я на один уровень глубже:

http://test.domain.com/one/index.php

Я получаю фактическую страницу индекса корня. Что я и хочу. но если бы я пошел глубже:

http://test.domain.com/one/two/anotherfile.php

Я получаю сообщение о том, что /anotherfile.php не найден, потому что он ищет его в корне. Так что, похоже, мое регулярное выражение не останавливается после последнего [a-z]. Я ценю любую помощь.

Это Apache2, если это вообще имеет значение.

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Механизм перезаписи повторяет все правила до тех пор, пока URI не станет одинаковым до и после итерации по правилам. Учитывая правило RewriteRule ^([a-z]+)?/(.+)$ $2 [L] и ввод: http://test.domain.com/one/index.php, вот что происходит:

  1. Начальная косая черта (префикс) удаляется из URI: one/index.php
  2. Правило применяется, URI соответствует ^([a-z]+)?/(.+)$
  3. URI переписывается на /index.php
  4. Внутреннее перенаправление, новый URI (/index.php) не соответствует старому URI (/one/index.php) и выполняется через правила перезаписи
  5. удаляется начальная косая черта
  6. Правило применяется, URI не соответствует ^([a-z]+)?/(.+)$
  7. URI не переписывается. новый URI (/index.php) совпадает со старым URI перед запуском через механизм перезаписи (/index.php), перезапись останавливается

Результирующий URI равен /index.php

Но с вводом: http://test.domain.com/one/two/anotherfile.php

  1. Ведущий слеш (префикс) удаляется из URI: one/two/anotherfile.php
  2. Правило применяется, URI соответствует ^([a-z]+)?/(.+)$
  3. URI переписывается в /two/anotherfile.php
  4. Внутреннее перенаправление, новый URI (/two/anotherfile.php) не совпадает со старым URI (/one/two/anotherfile.php) и выполняется через правила перезаписи
  5. удаляется начальная косая черта (two/anotherfile.php)
  6. Правило применяется, URI соответствует ^([a-z]+)?/(.+)$
  7. URI переписывается на /anotherfile.php
  8. Внутреннее перенаправление, новый URI (/anotherfile.php) не совпадает со старым URI (/two/anotherfile.php) и выполняется через правила перезаписи
  9. удаляется начальная косая черта (anotherfile.php)
  10. Правило применяется, URI не соответствует ^([a-z]+)?/(.+)$
  11. URI не переписывается. новый URI (/anotherfile.php) совпадает со старым URI перед запуском через механизм перезаписи (/anotherfile.php), перезапись прекращается

Результирующий URI равен /anotherfile.php

[L] не останавливает возврат полученного URI через механизм перезаписи, он просто останавливает процесс перезаписи для текущей итерации. Вам нужно изменить регулярное выражение или добавить какое-то условие перезаписи. Одна возможность - добавить RewriteRule ^[a-z+]/([a-z]+)?/(.+)$ $2 [L] перед тем, который у вас есть, чтобы 2 глубоких каталога обрабатывались отдельно.

0 голосов
/ 16 декабря 2011

Хмммм ...

Бросаю некоторые мысли там:

  1. Я думал, что может быть рекурсивно RewriteRule -ing ... но я неконечно, так как вы поместили там «последнее» правило. Тем не менее, это единственная логическая вещь, которая, я думаю, могла бы объяснить происходящее.

    1. Это отличается от того, что ваш Regex не останавливается - это будет продолжением Apache после того, как мыЯ сказал ему, чтобы сдаться.
  2. Если Apache не останавливается, я не уверен, что у вас есть.Возможно RewriteCond, DPI (DPI отбрасывает PATH_INFO), анализ THE_REQUEST или более?

Извините, я не мог помочь.Я надеюсь, что вы работали над этим в прошлом году.

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