2010-01-20 34 views
25

Với những điều kiện (Tôi biết ý nghĩa của chúng/làm):mod_rewrite: RewriteRule này làm gì?

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

không quy tắc đầu tiên làm gì? Dấu gạch ngang cô đơn đó là gì?

RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ /index.php [NC,L] 

Tôi đã sử dụng nó trong một thời gian dài kết hợp với Khung công tác Zend, nhưng tôi chưa bao giờ thực sự có được quy tắc đầu tiên.

Trả lời

46

RewriteCond directive chỉ mô tả một điều kiện bổ sung cho RewriteRule directive. Vì vậy, RewriteCond phải luôn được liên kết với một RewriteRule.

Trong trường hợp của bạn ba RewriteCond lẽ thuộc về RewriteRule đầu tiên như thế này:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

Bây giờ nguyên tắc này được áp dụng nếu các mô hình của các RewriteRule phù hợp với URL yêu cầu hiện tại (mỗi thư mục con đường lột trước đó) nếu điều kiện được đáp ứng. Trong trường hợp này, điều kiện chỉ đúng nếu khi ánh xạ URL yêu cầu đến hệ thống tệp khớp với tệp hiện có với kích thước tệp lớn hơn 0 (-s) hoặc liên kết tượng trưng (-l) hoặc thư mục (-d)). Vì vậy, quy tắc của bạn sẽ được áp dụng cho bất kỳ URL nào (^.*$ khớp với bất kỳ thứ gì) có thể được ánh xạ tới một thứ có sẵn trong hệ thống tệp của bạn. Việc thay thế - chỉ có nghĩa là không thay đổi bất cứ điều gì. Và NC (không có trường hợp, không phân biệt chữ hoa chữ thường, vô dụng trong ngữ cảnh này) và L (quy tắc cuối cùng nếu được áp dụng) là flags điều chỉnh mẫu, thay thế hoặc thực thi quy tắc.

+0

Aaahh vâng, điều đó có ý nghĩa. Lời giải thích rất rõ ràng. Cảm ơn bạn. –

+0

Vì vậy, mục đích của việc không thay đổi nó là gì? Là sự kết hợp của 2 quy tắc viết lại nói rằng "nếu nó tồn tại, hiển thị nó, nếu không chuyển tiếp mọi thứ khác tới index.php" –

+1

@WillshawMedia Có, quy tắc được đề cập cơ bản để lại bất kỳ yêu cầu nào đối với một tệp hiện có bị ảnh hưởng và thoát khỏi quá trình viết lại. Vì vậy, kết hợp với các quy tắc khác: viết lại chỉ bất kỳ tập tin không tồn tại để * index.php *. – Gumbo