$_SERVER['REQUEST_URI']を誤解していた

PHPのプログラムでユーザー入力由来の$_SERVER関係を出力する際、特別な事情がなければ、

  • URL関係はurlencodeでエンコード、パス中にパス関連の情報を入れるときは、rawurlencodeする
  • 通常は、htmlspecialcharsで第2、第3引数を適切に設定する

のが普通だと思っていました。
正直言えば、$_SERVER["REQUEST_URI"]を必要とする場面、そもそもエンコードで影響を受けるような文字列を通常は使わない習慣にしていたので気にしていなかったのですが、$_SERVER['REQUEST_URI']は、他の$_SERVER関連と違い、デコードされません。使わないと常識的な情報でも抜け落ちてしまうことがありますね(反省。

<?php
echo $_SERVER['REQUEST_URI'];

としてもよいかと思うのですが、手元の環境でチェックした限りでは確かにエンコードされていました。
しかし、エンコードされているものをデコードするかしないかという違いが$_SERVER['PHP_SELF']との違いだったとしても、サーバー実装、ブラウザ実装の関係をチェックしたとき、必ずエンコードされているということを保証できるのかという点についてはもう少し調べてみる必要があるのかもしれません。