2009-05-04 53 views
20

Tôi đang tìm cách viết lại url với nhiều phần tử. Một chuỗi con đang được yêu cầu dưới dạng thư mục con, trong khi bất kỳ chuỗi con nào khác được yêu cầu dưới dạng thông số chuỗi truy vấn thông thường.Dấu chấm hỏi phù hợp trong quy tắc mod_rewrite regex

Ví dụ, tôi muốn viết lại url từ

http://www.mysite.com/mark/friends?page=2 

để

http://www.mysite.com/friends.php?user=mark&page=2 

tôi có thể thực hiện điều này với ngoại lệ của nhân vật dấu hỏi. Đây là quy tắc viết lại của tôi:

... 
RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L] 

Nếu tôi thay đổi dấu chấm hỏi cho bất kỳ ký tự nào khác thì nó hoạt động tốt. Có vẻ như vấn đề là '?' ký tự được diễn giải không chính xác khi bắt đầu chuỗi truy vấn mới.

Tôi cần chuyển bất kỳ thông số nào xuất hiện sau/người dùng/bạn bè. Làm cách nào để tôi thực hiện việc này?

Trả lời

33

Bạn nên sử dụng cờ [QSA] thay vì cố gắng viết lại chuỗi truy vấn. [QSA] chuyển chuỗi truy vấn vào URL được viết lại.

Vì vậy, quy tắc của bạn sẽ giống như thế:

... 
RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L] 

trường hợp của bạn rất giống với the example given for using the QSA flag in the mod_rewrite cookbook.

+0

Cảm ơn câu trả lời. Hoạt động thực sự tốt và tôi đang đọc sách dạy nấu ăn ngay bây giờ. – markb

+0

Supers giải pháp nó làm việc cho tôi quá, mặc dù tôi chỉnh sửa mã để điều kiện của tôi: RewriteRule^([A-Za-z0-9 -_] +) \. Php? pindex.php? typeofpage = $ 1 [QSA, L] –

10

query is not part of the URL path and thus cannot be processed with the RewriteRule directive. Điều này chỉ có thể được thực hiện với chỉ thị RewriteCond (xem %{QUERY_STRING}).

Nhưng as Chad Birch already said nó đủ thứ đặt QSA flag để tự động nhận được truy vấn được yêu cầu ban đầu được thêm vào URL mới.

+0

QSA có sự cố được liệt kê tại https://stackoverflow.com/questions/16468098/what-is-l-in-qsa-l-in-htaccess/16468677#comment79837245_16468677 . Ngoài ra, rewritecond query_string không thể phân biệt các yêu cầu không có chuỗi truy vấn, so với các yêu cầu với các chuỗi truy vấn trần truồng (nghĩa là một dấu hỏi đơn và không có gì khác). Có cách nào để phân biệt hai yêu cầu này không? – Pacerier

+0

Ok nbm .. Tôi đã tìm thấy nó: '$ {the_request}' – Pacerier

1

Ngoài việc sử dụng các QSA viết lại lá cờ, bạn cũng có thể sử dụng các biến môi trường QUERY_STRING như hình dưới đây:

RewriteEngine On 
RewriteBase/
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING} 

Và URL trong câu hỏi

http://www.example.com/mark/friends?page=2 

sẽ được viết lại để (như được chỉ định):

http://www.example.com/friends.php?user=mark&page=2 
+0

Cool, '% {QUERY_STRING}' hoạt động. – Pacerier

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