2010-01-24 23 views
6

Tôi gặp sự cố khi viết lại URL cho một người điều phối fastcgi. Nếu tôi chỉ để lại:các vòng mod_rewrite ngay cả với cờ L

RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

Tôi mong đợi L (quy tắc cuối cùng) chỉ gây ra một lần viết lại. Thay vào đó, nó sẽ tiếp tục đăng ký trước dispatch.fcgi cho đến khi apache báo cáo lỗi.

Tôi biết nó có thể được cố định với:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ dispatch.fcgi/$1 [L,QSA] 

Nhưng lý do cho nhiều viết lại là gì? L có làm gì khác hơn tôi nghĩ không?

Trả lời

7

Tôi biết đó là một câu hỏi cũ, nhưng để người khác tìm kiếm các REAL câu trả lời, ở đây nó là:

Các [L] cờ DOES làm việc trong .htaccess tập tin. Nó yêu cầu rewrite module bỏ qua tất cả các quy tắc sau trong tệp .htaccess cụ thể đó. Nó thực hiện công việc của mình, Apache ghi lại url và thoát tệp .htaccess.

Tuy nhiên, ở cuối .htaccess tệp nếu url yêu cầu đã được viết lại, toàn bộ quá trình đối sánh url bắt đầu lại với url mới.

Đây là những gì xảy ra ở trên, ^(.*)$ sẽ luôn phù hợp url hiện tại, nó gây ra một vòng lặp vô hạn, chỉ có tùy chọn maxredirect viết lại (10 theo mặc định) dừng nó.

Các thử nghiệm thuộc tính tập tin !-f (như đã đề cập bởi người hỏi) sẽ giải quyết vấn đề, kể từ khi url sẽ phù hợp với một tên tập tin thực:

RewriteCond% {REQUEST_FILENAME} -f

RewriteRule^(. *) $ Dispatch.fcgi/$ 1 [L, QSA]

bây giờ, nếu chúng tôi yêu cầu http://example.com/toappend, .htaccess viết lại nó để dispatch.fcgi/toappendkhông viết lại vòng lặp sẽ xảy ra.

+0

Tại sao nó nếu tôi làm 'rewriterule. */Index.php' , có một vòng lặp vô hạn, nhưng nếu tôi làm 'rewriterule. * index.php' không có vòng lặp? – Pacerier

+0

Ok, tôi đã tìm thấy ans và viết nó xuống liên kết ở đây – Pacerier

2

Rõ ràng - và tôi chỉ đọc ở đây, tôi không có kiến ​​thức đầu tiên - chỉ thị [L] không hoạt động trong các tệp .htaccess, chỉ khi nó trong tệp .conf của bạn.

Xem: Hidden features of mod_rewrite

trong bối cảnh .htaccess, [L] sẽ không buộc mod_rewrite để dừng lại. nó sẽ tiếp tục kích hoạt nội

+0

Tôi đoán rằng câu trả lời http://stackoverflow.com/questions/1775877/ too - unfortunatley câu trả lời thực sự không được đánh dấu ở đó ... – viraptor

6

Hỷ, thêm này sau khi RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 

.. và nó sẽ làm việc vòng stoping.

Các vấn đề liên quan