2010-10-21 28 views
9

Xin vui lòng trợ giúp, tôi sẽ phát điên!Cách KHÔNG khớp một từ trong mod_rewrite

RewriteRule ^([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L] 

Đây là mã hiện tại của tôi. Đôi khi mọi người sẽ truy cập mysite.com/search, lần khác họ sẽ truy cập mysite.com/boris/search và tôi phát hiện người dùng có dấu kiểm trống ($ _ GET ['id']).

Tuy nhiên tôi đang tạo ra một tìm kiếm, mysite.com/products/search dẫn đến products_search.php

Tôi cần RewriteRule ban đầu của tôi để phù hợp với bất kỳ người dùng TRỪ từ 'sản phẩm'.

Tôi đã thử rất nhiều kết hợp.

RewriteRule ^(!products&[a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L] 

Tôi không giỏi lắm với regex/mod_rewrite nhưng tôi có điều gì đó như trên sẽ hoạt động? Tôi chỉ cần một toán tử AND rõ ràng là & không hoạt động, nhưng tôi không thể tìm được!

Rất cám ơn trước.

Trả lời

9

Bạn có hai lựa chọn: Hoặc là sử dụng một RewriteCond để hạn chế các chuỗi đã xuất hiện:

RewriteCond $1 !=products 
RewriteRule ^([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L] 

Hoặc kể từ Apache 2, bạn cũng có thể sử dụng một phủ nhận nhìn về phía trước khẳng định:

RewriteRule ^(?!products/)([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L] 

Bên cạnh đó, bạn cũng có thể sử dụng QSA flag thay vì thêm QUERY_STRING theo cách thủ công. Và lưu ý rằng mẫu hiện tại của bạn cũng sẽ cho phép một cái gì đó như /foobarsearch/, do đó, nó không có sự tách biệt /.

+0

Cảm ơn tất cả vì sự giúp đỡ của bạn! Bởi vì tôi đã sử dụng lá cờ [L], tôi đã kết thúc việc chỉ đặt dòng sản phẩm lên trước. – John

2

Không hẳn "Không phù hợp với một từ" - nhưng bạn có thể thêm một điều kiện trên viết lại để nói "Nếu URL không phù hợp với mô hình này"

RewriteCond %{REQUEST_URI} !^/products 
RewriteRule ^([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L] 

Mà nói chung là cách phổ biến nhất để làm những việc như thế này - vì điều kiện cũng có thể bị xích lại với nhau.

Bạn có thể tìm thêm thông tin về RewriteCond đây: - http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

1

Nếu mod_rewrite hỗ trợ lookaheads, bạn có thể sử dụng

RewriteRule ^(?!products)([a-z0-9_-]+)?/?search.... 

Theo to this question on serverfault.com phiên bản mới hơn làm.

Phần (?!products) yêu cầu công cụ regex nhìn về phía trước và thất bại nếu tìm thấy "sản phẩm".

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