クエリ文字列を渡すときの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
ご覧のとおり、クエリ文字列はダブルエスケープされていますが、これは誤りです。誰かがこれをどのように修正できるか考えていますか?私たちが試したいくつかのこと:
/
エスケープするパスのa
とb
の間。クエリ文字列を手動でアンエスケープします。
RewriteCond %{QUERY_STRING} .*
RewriteMap unescape int:unescape
RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
ただし、これは、たとえば&
とエスケープされた&
クエリ文字列内。
更新:
このバグレポート は同じ問題について説明しています。最初のコメントは明らかに問題を修正しているコミットにリンクしていますが、Pieterが以下に述べるように、実際には修正されているようには見えません。
これはApacheのバグのようです。このバグレポートは少し厄介ですが、問題を正確に説明しています:
https://issues.Apache.org/bugzilla/show_bug.cgi?id=34602
彼らは問題を認識しているようです。バグは彼らが修正したと主張していますが、私はこれをApache 2.3.15でテストしましたが、問題はまだそこにあるようです。また、Apache 2.3はベータ版であるため、Apache 2.4がリリースされるまで、たとえ修正されても役に立たないことに注意してください。