Apache mod_rewrite mengkodekan string kueri pada redirect

13

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 /antara adan bbagian-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.

Erik Hesselink
sumber

Jawaban:

7

Ini sepertinya bug di Apache. Laporan bug ini agak berantakan, tetapi jelas menggambarkan masalah Anda:

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

Sepertinya mereka menyadari masalah ini. Meskipun bug mengklaim mereka telah memperbaikinya, saya telah menguji ini dengan Apache 2.3.15, dan masalahnya masih ada. Juga perhatikan bahwa Apache 2.3 adalah versi beta, jadi tidak ada gunanya bagi Anda bahkan jika itu memperbaikinya, sampai Apache 2.4 keluar.

Pieter
sumber
Tampaknya Apache 2.4.10 masih melakukan ini, meskipun seharusnya sudah diperbaiki di 2.4.1 .
Arjan
1
Saya masih melihat masalah di 2.4.7
François