Khi tôi có nhiều RewriteCond xích lại với nhau, chỉ các nhóm chụp của RewriteCond mới có thể được tham chiếu với %0
- %9
.Các nhóm chụp tham chiếu của nhiều RewriteCond trong RewriteRule
Trong sự cố sau, các tham số trong chuỗi truy vấn của url có thể theo bất kỳ thứ tự nào. Để phân tích chúng thành một url lạ mắt, tôi cần phải đối sánh từng thông số trong chuỗi truy vấn riêng lẻ:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %{QUERY_STRING} param2=([^&]+)
RewriteCond %{QUERY_STRING} param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
Như tôi đã chỉ ra ... điều này không hiệu quả. Để sửa lỗi này, tôi có thể tham khảo các nhóm chụp của RewriteCond trước đó trong RewriteCond tiếp theo và 'tuyên truyền' mỗi tham số cho RewriteRule thực tế:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %1&%{QUERY_STRING} ^([^&]*)&.*param2=([^&]+)
RewriteCond %1&%2&%{QUERY_STRING} ^([^&]*)&([^&]*)&.*param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
này nên làm việc, nhưng đối với mỗi tham số bổ sung nó lấy của Messier. Một giải pháp khác có thể phân tích cú pháp một tham số và chuyển hướng máy khách sau mỗi tham số (dẫn đến một chuỗi các chuyển hướng dài, mà tôi muốn tránh).
Có một cách sạch tiếp cận các nhóm bắt giữ tất cả của RewriteCond trong RewriteRule (ví dụ như là nó có thể để đặt tên họ hay gán chúng cho một biến vì vậy tôi có thể tham khảo chúng ở một nơi khác?)
+1 cho một câu hỏi lớn. Tôi cũng đã phải đối mặt với vấn đề này, và sẽ muốn biết câu trả lời – anubhava
Các tài liệu mod_rewrite nói rằng RewriteCond backreferences chỉ giữ lại ** trùng khớp lần cuối ** trong tập hợp điều kiện hiện tại, vì vậy, vâng, câu trả lời thứ hai của bạn có thể là chỉ trả lời trong tuyến đường này. Do sự phức tạp của nó, bạn có nghĩ về việc thiết lập một kịch bản tại 'foo' phân tích cú pháp GET) hoặc POST) và chuyển hướng đến' bar' thích hợp không? – miah