Apache mod_rewriteはリダイレクト時にクエリ文字列をダブルエンコードします


13

クエリ文字列を渡す際のApache mod_rewriteの動作に関する奇妙な問題(おそらくバグ?)に遭遇しました。

再現するために、デフォルトのApache構成でクリーンなUbuntu(oneiric)インストールをセットアップしました。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

ご覧のとおり、クエリ文字列は二重エスケープされていますが、これは間違っています。これを修正する方法はありますか?私たちが試したいくつかのこと:

  • [NE]を追加します。これにより正しいクエリ文字列が得られますが、パスはエスケープされず、新しい問題につながります。
  • [NE、B]を追加します。これは機能しているように見えますが、パスのとの/間の部分がエスケープされます。ab
  • クエリ文字列を手動でエスケープ解除します。

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    

    ただし、これは、たとえば、クエリ文字列で&エスケープさ&れたan とエスケープされた文字を区別できないことを意味します。

更新:

このバグレポートでは、同じ問題について説明しています。最初のコメントは明らかに問題を修正するコミットにリンクしていますが、Pieterが以下で述べているように、実際に修正されているようには見えません。

回答:


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で修正されているはずです。
アルジャン

1
2.4.7
フランソワ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.