Назад | Перейти на главную страницу

RewriteRules не останавливается с флагом LAST?

Кажется, у меня проблемы с модулем Rewrite Apache 2.2 (работающим на FreeBSD 8). Мой .htaccess файл выглядит следующим образом:

Options -Indexes

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L] 

Но почему-то последнее правило отменяет остальные три. Как только я это прокомментирую, остальные правила работают должным образом:

Я пробовал различные комбинации L, NS, и S=n флаги на каждом RewriteRule, но если я не закомментирую последнее правило, все будет направлено на index.php. Как заставить Apache прекратить обработку RewriteRules как только он найдет совпадение?

RewriteRule генерирует ВНУТРЕННЕЕ ПОВТОРНОЕ НАПРАВЛЕНИЕ, затем обработка повторяется, начиная с первого RewriteRule (RewriteRule ^ xpaste $ cross.php [L]). Вам нужно добавить RewriteCond перед последним RewriteRule:

 RewriteEngine on
 RewriteRule ^xpaste$ cross.php [L]
 RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
 RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
 RewriteCond %{REQUEST_URI} !^/(cross|index)\.php$
 RewriteRule ^(.*)$ index.php [L]

NS по последнему правилу должно было сработать. Могли бы сделать и по другим правилам, без вреда. Я добираюсь туда, где делаю '[L, NS]', добавляя NS везде, где есть L.

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L,NS] 

Я еще не тестировал их, но здесь есть интересный подход для вашего более общего решения с использованием переменной IS_SUBREQ. https://stackoverflow.com/questions/9555247/can-anyone-think-of-when-a-sub-request-rewrite-is-useful

В этом сообщении также упоминается переменная REDIRECT_STATUS. http://www.webmasterworld.com/apache/4299003.htm