Кажется, у меня проблемы с модулем 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]
Но почему-то последнее правило отменяет остальные три. Как только я это прокомментирую, остальные правила работают должным образом:
www.example.com/xpaste
открывается cross.php
www.example.com/x132633
открывается cross.php?id=132633
www.example.com/gen
открывается index.php?gen
Я пробовал различные комбинации L
, NS
, и S=n
флаги на каждом RewriteRule
, но если я не закомментирую последнее правило, все будет направлено на index.php
. Как заставить Apache прекратить обработку RewriteRule
s как только он найдет совпадение?
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