mod_rewrite: совпадать, только если не найдено ни одного предыдущего правила? - PullRequest
0 голосов
/ 01 октября 2009

У меня есть большой набор правил переписывания, таких как:

RewriteRule ^foo foo.php?blah [L]
RewriteRule ^bar foo.php?baz [L]

И затем у меня есть какое-то правило всеохватывающего действия, которое я хочу применить, только если вышеприведенные правила не совпадают (например, например, для /blatz). Пока я не забываю включить [L], это прекрасно работает - но у меня уже были проблемы дважды с случайным забыванием этого.

Есть ли какой-нибудь простой способ заставить мое правило перехвата не соответствовать , если более раннее правило соответствовало? (в идеале, без добавления чего-либо к каждому правилу)

1 Ответ

1 голос
/ 01 октября 2009

Единственное решение, которое я могу изобразить, это использовать флаг S, чтобы пропустить последнее правило:

RewriteRule ^foo foo.php?blah [L,S=999]
RewriteRule ^bar foo.php?baz [L,S=999]
RewriteRule …

Или установить переменную окружения:

RewriteRule ^foo foo.php?blah [L,E=FLAG:1]
RewriteRule ^bar foo.php?baz [L,E=FLAG:1]
RewriteCond %{ENV:FLAG} ^$
RewriteRule …

Редактировать Хорошо, вот еще одно решение, которое сравнивает текущий URL с первоначально запрошенным:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^?\s]*)\??([^\s]*)
RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$
RewriteRule …

Но я думаю, что для этого требуется как минимум Apache 2, потому что Apache 1.x, использующий POSIX ERE, и POSIX ERE, не поддерживают \n обратных ссылок в шаблоне.

...