thứ tự thực hiện htaccess và ưu tiên


19

Bất cứ ai cũng có thể giải thích cho tôi theo thứ tự apache thực thi các tệp .htaccess nằm ở các cấp khác nhau của cùng một đường dẫn và cách các quy tắc viết lại trong đó được ưu tiên?

Ví dụ: tại sao quy tắc viết lại trong .htaccess đầu tiên bên dưới không hoạt động và là quy tắc được /blogưu tiên?

.htaccess trong /

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

.htaccess trong /blog

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

PS: Tôi không chỉ đơn giản là tìm kiếm một câu trả lời mà là một cách để hiểu nội bộ apache / mod_rewrite ... tại sao điều đó quan trọng với tôi hơn là cách khắc phục điều này,

Câu trả lời:


20

Tôi cho rằng bạn nên đọc Hướng dẫn Apache: .htaccess , chủ yếu là phần "Cách áp dụng các chỉ thị", trong đó nêu rõ:

Các chỉ thị cấu hình được tìm thấy trong tệp .htaccess được áp dụng cho thư mục chứa tệp .htaccess và cho tất cả các thư mục con của chúng. Tuy nhiên, điều quan trọng cũng cần nhớ là có thể đã có các tệp .htaccess trong các thư mục cao hơn. Chỉ thị được áp dụng theo thứ tự mà chúng được tìm thấy. Do đó, một tệp .htaccess trong một thư mục cụ thể có thể ghi đè các lệnh được tìm thấy trong các tệp .htaccess được tìm thấy cao hơn trong cây thư mục. Và những cái đó, lần lượt, có thể đã ghi đè các lệnh được tìm thấy cao hơn hoặc trong chính tệp cấu hình máy chủ chính.

Cho nó đọc đầy đủ và .htaccess sẽ không còn là bí ẩn nữa.


7
mod_rewrite là một trường hợp đặc biệt. Quy tắc viết lại được áp dụng từ dưới lên. Đầu tiên các quy tắc trong thư mục con sau đó là các quy tắc trong thư mục mẹ.
GetFree

Tài liệu được liệt kê ở trên là dành cho Apache 2.2. Đối với phiên bản hiện tại của apache, hãy truy cập liên kết này thay vì httpd.apache.org/docs/civerse/howto/htaccess.html
SherylHohman

3

Bạn có thể sử dụng RewriteOptions inheritđể kế thừa các quy tắc viết lại của thư mục cha. Tuy nhiên, các quy tắc viết lại của thư mục mẹ sẽ được áp dụng sau, theo tài liệu về RewriteOptions .


1
Viết lại các chỉ thị cho các thư mục mẹ sẽ được áp dụng ngay cả khi không có câu lệnh này (điều này hơi khó hiểu) nhưng tôi cho rằng điều này có thể được sử dụng để thực hiện một bản sao ảo + dán các lệnh từ cha mẹ sang con (có thể có các cơ sở viết lại khác nhau). Không có gì ngạc nhiên khi mod_rewrite gây rối với đầu của bạn đôi khi ... Argh.
Simon East

2
@SimonEast "Viết lại chỉ thị cho các thư mục mẹ sẽ được áp dụng ngay cả khi không có tuyên bố này" - Bạn có chắc không? Bạn đã có một tài liệu tham khảo? Cụ thể, các mod_rewritechỉ thị không được kế thừa theo mặc định (khác với các mô-đun khác). Bạn sẽ cần một RewriteOptions InheritXXXXchỉ thị ở đâu đó để chỉ thị được kế thừa. Tuy nhiên, điều này trở nên phức tạp hơn trên Apache 2.4+ với InheritDowntùy chọn có thể được chỉ định trong các thư mục mẹ và cấu hình máy chủ để điều khiển các thư mục con.
MrWhite
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.