Apache mod_rewrite ดับเบิลเข้ารหัสสตริงแบบสอบถามเมื่อเปลี่ยนเส้นทาง


13

เราพบปัญหาแปลก ๆ (ข้อผิดพลาดหรืออาจ?) กับพฤติกรรมของ 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}}
    

    อย่างไรก็ตามนี่หมายความว่าเราไม่สามารถแยกแยะความแตกต่างระหว่างพูด&และกับการหลีกเลี่ยง&ในแบบสอบถามสตริง

ปรับปรุง:

รายงานข้อผิดพลาดนี้อธิบายถึงปัญหาเดียวกัน ความคิดเห็นแรกเชื่อมโยงไปยังคอมมิชชันที่แก้ไขปัญหา แต่ในขณะที่ปีเตอร์พูดด้านล่างดูเหมือนจะไม่ได้รับการแก้ไขจริง

คำตอบ:


7

นี่น่าจะเป็นบั๊กใน Apache รายงานข้อผิดพลาดนี้ค่อนข้างยุ่ง แต่อธิบายปัญหาของคุณอย่างแน่นอน:

https://issues.apache.org/bugzilla/show_bug.cgi?id=34602

ดูเหมือนว่าพวกเขาจะตระหนักถึงปัญหานี้ แม้ว่าข้อผิดพลาดอ้างว่าพวกเขาได้รับการแก้ไขฉันได้ทดสอบกับ Apache 2.3.15 และปัญหายังคงมีอยู่ โปรดทราบว่า Apache 2.3 เป็นรุ่นเบต้าดังนั้นจึงไม่มีประโยชน์สำหรับคุณแม้ว่าจะแก้ไขได้จนกว่า Apache 2.4 จะหมด


ดูเหมือนว่า Apache 2.4.10 ยังคงทำเช่นนี้แม้ว่ามันควรจะได้รับการแก้ไขใน 2.4.1
Arjan

1
ฉันยังเห็นปัญหาใน 2.4.7
François
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.