2010-04-20 3 views
0

Я искал ответ в течение нескольких часов, так что извините, если его попросили несколько раз, я пропустил его.RewriteRule, являющийся жадным

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

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, если это имеет значение вообще.

+0

Предполагая, что вход является 'one/index.php' и' one/two/anotherfile.php', регулярное выражение работает так, как ожидалось, оно возвращает 'two/anotherfile.php' для второй строки. Возможно ли, что ваша проблема находится где-то в другом месте? Можете ли вы опубликовать несколько подробностей? – Kobi

+0

Спасибо, но я не знаю, что еще может быть. Вот что у меня есть:!? RewriteEngine На RewriteCond% {REQUEST_URI} ^/Lib RewriteCond% {REQUEST_URI} ^/изображения RewriteRule^([AZ] +)/(. +) $ $ 2 [L] это: http://test.domain.com/one/two/index.php возвращает таже страница (/index.php) как: http://test.domain.com/one/ index.php – lardlad

+0

Есть ли что-то еще, что я должен попробовать? Это регулярное выражение является жадным. Если я изменяю регулярное выражение на «RewriteRule^(один)?/(. +) $ $ 2 [L]», он отлично работает. Но я надеялся сделать этот первый динамический каталог. – lardlad

ответ

0

Хммм ...

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

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

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

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

1

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