2009-03-30 47 views
12

Tôi đã sử dụng quy tắc mod_rewrite đơn giản cho CMS của mình trong nhiều năm và hiện đang tạo phiên bản mới, tôi thấy rewriteCond không có ý nghĩa- Tôi có tiêu chuẩn "nếu không phải là tệp "nhưng tôi vẫn thấy những người viết lại được đánh giá mặc dù họ không được phép. đang viết lại tôi:.htaccess! -f quy tắc không hoạt động

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?page=$1 
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&var=$2 

tôi tải/trang/var và nó hoạt động tốt như page = trang & var = var index.php, nhưng tôi cố gắng để tải /css/file.css và nó tải index?. php? page = css & var = file.css mặc dù /css/file.css một tệp, vì vậy toàn bộ phần viết lại không được đánh giá.

Tôi chưa bao giờ thấy htaccess rõ ràng thách thức logic của riêng mình, ai đó có thể giúp tôi tìm ra điều này không? Có ai từng trải qua bất cứ thứ gì như thế này không?

Trả lời

3

Vâng, điều đó sẽ hiệu quả.

thiết lập các đạo cụ sau trong .htaccess của bạn Hãy thử:

RewriteLog /var/log/rewrite.log 
RewriteLogLevel 3 

Để gỡ lỗi yêu cầu của bạn. Hãy nhớ đặt lại giá trị này khi bạn đã hoàn tất, nếu không bạn sẽ kết thúc bằng một đĩa cứng đã được điền đầy.

+0

+1 cho công cụ RewriteLog, nó đã giúp tôi gỡ lỗi các quy tắc viết lại của mình. –

25

Chỉ áp dụng RewriteCondition cho quy tắc tiếp theo. Bạn muốn điều này:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?page=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&var=$2 
+2

Thật tuyệt vời, sau tất cả những năm làm mod_rewrites như thế này hóa ra logic của tôi đã hoạt động một cách vô tình ... cảm ơn rất nhiều –

+0

tuyệt vời, cảm ơn bạn !! .. cũng nên nhớ rằng nếu tệp không tồn tại , nó sẽ KHÔNG 404, nó sẽ chuyển nó tới quy tắc tiếp theo. – Roberto

+0

@Colin - tình cảm của tôi chính xác. Bây giờ tôi phải tìm ra cho dù đó là một cứu trợ, hoặc lo lắng ... – Ben

13

Nếu bạn đang sử dụng Apache 2.2, sau đó bạn phải đọc:

http://amandine.aupetit.info/135/apache2-mod_rewrite/

Spoiler: những gì bạn sẽ cần phải viết thực sự là:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l   

Merc.

+0

Thêm '% {DOCUMENT_ROOT}' giải quyết được sự cố. – hlcs

+1

Tôi đã tìm kiếm này cho sooo dài, hoàn toàn giải quyết vấn đề của tôi (Tôi không sử dụng vhost, nhưng container). Cảm ơn! – Gildas

+0

Vì người hỏi sẽ không chấp nhận một câu trả lời, sẽ rất tuyệt nếu câu trả lời của tôi có nhiều sự phản đối nhất ... – Merc

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