порядок и приоритет выполнения htaccess

19

Может ли кто-нибудь объяснить мне, в каком порядке apache выполняет файлы .htaccess, находящиеся на разных уровнях одного и того же пути, и как приоритезируются правила перезаписи в них?

Например, почему правило перезаписи в первом .htaccess ниже не работает и является /blogприоритетным?

.htaccess в /

RewriteEngine on
RewriteBase /
RewriteRule ^blog offline.html [L]

.htaccess в /blog

RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

PS: я не просто ищу ответ, но для того, чтобы понять внутренности apache / mod_rewrite ... почему для меня важнее, чем как это исправить,

ChrisR
источник

Ответы:

20

Я полагаю, вам следует прочитать Учебное пособие по Apache: .htaccess , в основном раздел «Как применяются директивы», в котором говорится:

Директивы конфигурации, найденные в файле .htaccess, применяются к каталогу, в котором находится файл .htaccess, и ко всем его подкаталогам. Однако важно также помнить, что в каталогах выше могут быть файлы .htaccess. Директивы применяются в порядке их нахождения. Следовательно, файл .htaccess в определенном каталоге может переопределять директивы, найденные в файлах .htaccess, находящихся выше в дереве каталогов. А те, в свою очередь, могут иметь переопределенные директивы, найденные еще выше, или в самом файле конфигурации основного сервера.

Прочитайте его полностью и .htaccess больше не будет загадкой.

Том Пьетросанти
источник
7
mod_rewrite - это особый случай. Правила переписывания применяются снизу вверх. Сначала правила в подкаталоге, а затем правила в родительском каталоге.
GetFree
Документ, указанный выше, предназначен для Apache 2.2. Для текущей версии apache перейдите по этой ссылке вместо httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman
3

Вы можете использовать RewriteOptions inheritдля наследования правил перезаписи родительского каталога. Тем не менее, правила перезаписи родительского каталога будут применены позже, согласно документации на RewriteOptions .

Lèse Majesté
источник
1
Директивы перезаписи для родительских каталогов будут применяться даже без этого оператора (что несколько сбивает с толку), но я предполагаю, что это можно использовать для виртуального копирования + вставки директив от родителя к потомку (которые могут иметь разные базы перезаписи). Неудивительно, что mod_rewrite иногда портит тебе голову ... Аааа.
Саймон Ист
2
@SimonEast «Директивы перезаписи для родительских каталогов будут применяться даже без этого утверждения» - Вы уверены? У вас есть ссылка? В частности, mod_rewriteдирективы не наследуются по умолчанию (в отличие от других модулей). Вам понадобится RewriteOptions InheritXXXXдиректива где-то, чтобы директивы были унаследованы. Однако это становится более сложным в Apache 2.4+ с InheritDownопцией, которую можно указать в родительских каталогах и в конфигурации сервера, которая затем контролирует дочерние каталоги.
MrWhite