Порядок і пріоритет виконання htaccess


19

Чи може хто-небудь пояснити мені, в якому порядку апаш виконує файли .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 ... чому для мене важливіше, ніж як це виправити,

Відповіді:


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 .


1
Переписати директиви для батьківських каталогів будуть застосовуватися навіть без цього твердження (що дещо заплутано), але я припускаю, що це може бути використане для виконання віртуальної копії + вставки директив від батьків до дитини (які можуть мати різні бази для перезапису). Недарма mod_rewrite псується з головою іноді ...
Саймон Схід

2
@SimonEast "Переписати директиви для батьківських каталогів будуть застосовуватися навіть без цього твердження" - Ви впевнені? У вас є довідник? Зокрема, mod_rewriteдирективи не успадковуються за замовчуванням (відрізняються від інших модулів). Вам буде потрібно RewriteOptions InheritXXXXдиректива де - то для директиви у спадок. Однак це стає складнішим для Apache 2.4+ з InheritDownможливістю, яку можна вказати у батьківських каталогах та серверній конфігурації, яка потім контролює дочірні каталоги.
MrWhite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.