Chúng tôi đã gặp phải một vấn đề lạ (có lẽ là lỗi?) Với hành vi của mod_rewrite của Apache khi chuyển qua các chuỗi truy vấn.
Để tái tạo, chúng tôi đã thiết lập cài đặt Ubuntu (một chiều) sạch với cấu hình Apache mặc định. Chúng tôi đã kích hoạt mod_rewrite và trong cấu hình trang mặc định, chúng tôi đã thêm vào như sau:
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Để kiểm tra, chúng tôi sử dụng curl:
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
Đầu ra có liên quan là:
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Như bạn có thể thấy, chuỗi truy vấn được thoát kép, đó là sai. Có ai có bất cứ ý tưởng làm thế nào chúng ta có thể khắc phục điều này? Một vài điều chúng tôi đã thử:
- Thêm [NE]. Điều này cung cấp cho chúng ta chuỗi truy vấn chính xác, nhưng đường dẫn không được giải quyết, dẫn đến các vấn đề mới.
- Thêm [NE, B]. Điều này dường như hoạt động, nhưng làm cho
/
giữaa
vàb
các phần của con đường được thoát ra. Unscaping chuỗi truy vấn bằng tay.
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Tuy nhiên, điều này có nghĩa là chúng ta không thể phân biệt giữa, giả sử
&
và một thoát&
trong chuỗi truy vấn.
Cập nhật:
Báo cáo lỗi này mô tả cùng một vấn đề. Nhận xét đầu tiên liên kết đến một cam kết rõ ràng đang khắc phục vấn đề, nhưng như Pieter nói dưới đây, có vẻ như nó không thực sự được sửa chữa.