เราพบปัญหาแปลก ๆ (ข้อผิดพลาดหรืออาจ?) กับพฤติกรรมของ Apache mod_rewrite เมื่อผ่านสตริงการสืบค้น
ในการทำซ้ำเราได้ติดตั้ง Ubuntu แบบติดตั้ง (oneiric) ที่สะอาดพร้อมการกำหนดค่าเริ่มต้นของ Apache เราได้เปิดใช้งาน mod_rewrite และในการกำหนดค่าไซต์เริ่มต้นเราได้เพิ่มสิ่งต่อไปนี้:
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
ในการทดสอบเราใช้ curl:
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
ผลลัพธ์ที่เกี่ยวข้องคือ:
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
อย่างที่คุณเห็นสตริงเคียวรีจะถูก Escape สองครั้งซึ่งผิด ไม่มีใครมีความคิดว่าเราจะแก้ไขได้อย่างไร สองสิ่งที่เราได้ลอง:
- กำลังเพิ่ม [NE] สิ่งนี้ทำให้เรามีสตริงการสืบค้นที่ถูกต้อง แต่ไม่มีการใช้พา ธ ซึ่งทำให้เกิดปัญหาใหม่
- กำลังเพิ่ม [NE, B] สิ่งนี้ดูเหมือนว่าจะใช้งานได้ แต่ทำให้
/
ระหว่างa
และb
ส่วนต่าง ๆ ของเส้นทางที่จะหลบหนี ยกเลิกการสร้างสตริงแบบสอบถามด้วยตนเอง
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
อย่างไรก็ตามนี่หมายความว่าเราไม่สามารถแยกแยะความแตกต่างระหว่างพูด
&
และกับการหลีกเลี่ยง&
ในแบบสอบถามสตริง
ปรับปรุง:
รายงานข้อผิดพลาดนี้อธิบายถึงปัญหาเดียวกัน ความคิดเห็นแรกเชื่อมโยงไปยังคอมมิชชันที่แก้ไขปัญหา แต่ในขณะที่ปีเตอร์พูดด้านล่างดูเหมือนจะไม่ได้รับการแก้ไขจริง