Kami mengalami masalah aneh (bug, mungkin?) Dengan perilaku Apache mod_rewrite ketika melewati string kueri.
Untuk mereproduksi, kami telah menyiapkan instalasi Ubuntu (oneiric) yang bersih dengan konfigurasi Apache default. Kami telah mengaktifkan mod_rewrite, dan dalam konfigurasi situs default, kami telah menambahkan yang berikut:
RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Untuk menguji, kami menggunakan curl:
curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
Output yang relevan adalah:
HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Seperti yang Anda lihat, string kueri lolos dua kali, yang salah. Adakah yang tahu bagaimana kami bisa memperbaikinya? Beberapa hal yang telah kami coba:
- Menambahkan [NE]. Ini memberi kami string kueri yang benar, tetapi lintasan tidak terhapus, yang mengarah ke masalah baru.
- Menambahkan [NE, B]. Ini tampaknya berhasil, tetapi menyebabkan
/
antaraa
danb
bagian-bagian dari jalan untuk diloloskan. Membatalkan penghapusan string kueri secara manual.
RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Namun, ini berarti kita tidak dapat membedakan antara, katakanlah,
&
dan yang lolos&
dalam string-kueri.
Memperbarui:
Laporan bug ini menjelaskan masalah yang sama. Komentar pertama menghubungkan ke sebuah komit yang tampaknya memperbaiki masalah, tetapi seperti yang dikatakan Pieter di bawah, sepertinya tidak benar-benar diperbaiki.