htaccess urutan dan prioritas eksekusi

19

Adakah yang bisa menjelaskan kepada saya bagaimana apache mengeksekusi file .htaccess yang berada di berbagai tingkat jalur yang sama dan bagaimana memprioritaskan aturan penulisan ulang di dalamnya?

Misalnya, mengapa aturan penulisan ulang di .htaccess pertama di bawah ini tidak berfungsi dan apakah yang di /blogprioritaskan?

.htaccess di /

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

.htaccess di /blog

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

PS: Saya tidak hanya mencari jawaban tetapi cara untuk memahami internal apache / mod_rewrite ... mengapa lebih penting bagi saya daripada bagaimana memperbaikinya,

ChrisR
sumber

Jawaban:

20

Saya kira Anda harus membaca Tutorial Apache: .htaccess , terutama bagian "Bagaimana arahan diterapkan", yang menyatakan:

Arahan konfigurasi yang ditemukan dalam file .htaccess diterapkan ke direktori tempat file .htaccess ditemukan, dan ke semua subdirektori daripadanya. Namun, penting juga untuk diingat bahwa mungkin ada file .htaccess di direktori yang lebih tinggi. Arahan diterapkan dalam urutan yang ditemukan. Oleh karena itu, file .htaccess dalam direktori tertentu dapat menggantikan arahan yang ditemukan dalam file .htaccess yang ditemukan lebih tinggi di pohon direktori. Dan mereka, pada gilirannya, mungkin telah menimpa arahan yang ditemukan lebih tinggi, atau dalam file konfigurasi server utama itu sendiri.

Berikan bacaan lengkap dan .htaccess tidak lagi menjadi misteri.

Tom Pietrosanti
sumber
7
mod_rewrite adalah kasus khusus. Aturan penulisan ulang diterapkan dari bawah ke atas. Pertama aturan di subdirektori kemudian aturan di direktori induk.
GetFree
Doc yang tercantum di atas adalah untuk Apache 2.2. Untuk versi apache saat ini, buka tautan ini sebagai gantinya httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman
3

Anda dapat menggunakan RewriteOptions inherituntuk mewarisi aturan penulisan ulang direktori induk. Namun, aturan penulisan ulang direktori induk akan diterapkan kemudian, sesuai dokumentasi pada RewriteOptions .

Lèse majesté
sumber
1
Arahan penulisan ulang untuk direktori induk akan diterapkan bahkan tanpa pernyataan ini (yang agak membingungkan) tetapi saya kira ini dapat digunakan untuk melakukan salinan virtual + rekat dari arahan dari orangtua kepada anak (yang mungkin memiliki basis penulisan ulang yang berbeda). Tidak heran mod_rewrite kadang-kadang mengacaukan pikiran Anda ... Argh.
Simon East
2
@SimonEast "Menulis ulang arahan untuk direktori induk akan diterapkan bahkan tanpa pernyataan ini" - Apakah Anda yakin? Apakah Anda punya referensi? Secara khusus, mod_rewritearahan tidak diwarisi secara default (berbeda dengan modul lainnya). Anda akan membutuhkan RewriteOptions InheritXXXXarahan di suatu tempat untuk arahan diwarisi. Namun, ini menjadi lebih kompleks di Apache 2.4+ dengan InheritDownopsi yang dapat ditentukan dalam direktori induk dan konfigurasi server yang kemudian mengontrol direktori anak.
MrWhite