日本語の情報がほとんどないようなのでメモ。次の環境でWebアプリケーションを動作させているとき:
- Windows 7
- IIS Express
- PHP
- URL書き換え設定あり
サーバー変数"REQUEST_URI"設定値にURLエンコードされた値が含まれていると、その値はデコードできない値になります。
たとえばURLに「作品("\u4F5C\u54C1)」という文字列を含めたとしましょう。UTF-8でURLエンコードすると次の表現になります:
%E4%BD%9C%E5%93%81
しかしサーバー変数"REQUEST_URI"に設定される値は次になります:
%8D%EC%95i
……元の値は影もかたちもありません。つまりここからの値の取得は 不可能 ということです。
バグと表現してよいであろうこの現象はどうもURL書き換えモジュールの処理と関係があるようで、URL 書き換えモジュール構成のリファレンスで触れられているサーバー変数"UNENCODED_URL"を参照すると回避できます。このサーバー変数がApacheやNginxなどで設定されるとは思えませんし、IISでも環境によって設定にばらつきがありそうですから、"UNENCODED_URL"が存在するときはそちらを、存在しないときは"REQUEST_URI"を参照するようにするとよいでしょう。
以上、最新のIISやAzure App Service等では解消されているのかもしれませんが、備忘録代わりということで。