Я заметил нечто неожиданное при отладке правил перезаписи: кажется, что порядок событий таков, что Apache обрабатывает правило, а затем задним числом применяет к нему предыдущие условия. Это как-либо разработано, или я что-то неправильно понимаю?
Вот простой пример правила перезаписи в моем файле .htaccess. На самом деле он ничего полезного не делает - это всего лишь пример.
RewriteEngine on
Options FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . / [L]
А вот и полученная трассировка (сильно отредактированная для удобства чтения)
[...redacted...] init rewrite engine with requested uri /test.html
[...redacted...] pass through /test.html
[...redacted...] [perdir /var/www/html/] strip per-dir prefix: /var/www/html/test.html -> test.html
[...redacted...] [perdir /var/www/html/] applying pattern '.' to uri 'test.html'
[...redacted...] [perdir /var/www/html/] RewriteCond: input='/var/www/html/test.html' pattern='!-f' => not-matched
[...redacted...] [perdir /var/www/html/] pass through /var/www/html/test.html
Обратите внимание, что «RewriteCond» применяется после шаблон применяется. Конечный результат - сквозной, который является правильным (поскольку файл действительно существует), так что это не имеет значения. Я не мог найти ничего об этом в документации.