web-dev-qa-db-ja.com

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

クエリ文字列を渡すときの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}}
    

    ただし、これは、たとえば&とエスケープされた&クエリ文字列内。

更新:

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

13
Erik Hesselink

これはApacheのバグのようです。このバグレポートは少し厄介ですが、問題を正確に説明しています:

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

彼らは問題を認識しているようです。バグは彼らが修正したと主張していますが、私はこれをApache 2.3.15でテストしましたが、問題はまだそこにあるようです。また、Apache 2.3はベータ版であるため、Apache 2.4がリリースされるまで、たとえ修正されても役に立たないことに注意してください。

7
Pieter