WebサーバーがURI比較を行うために、エスケープされた予約されていない文字(alphanumなど)をデコードする必要があることは明らかです。たとえば、http://www.example.com/~user/index.htm
はと同じですhttp://www.example.com/%7Euser/index.htm
。
私の質問は、エスケープされた予約文字をどうするかということです。
例は、、%2F
または/
です。リクエストURIにが含まれている場合、Webサーバーのパーサーはそれを?%2F
に置き換える必要があります。/
上記の例では、それは?http://www.example.com/~user%2Findex.htm
と同じになることを意味します。http://www.example.com/~user/index.htm
Apacheサーバー(2.2.17 Unix)で試してみましたが、「404NotFound」エラーが発生するようです。
つまり%2F
、他のエスケープされた予約文字は(少なくともURI比較の前に)そのままにしておく必要がありますか?
背景情報:
RFC 2616(HTTP 1.1)には、エスケープデコードの問題に言及している場所が2つあります。
Request-URIは、セクション3.2.1で指定された形式で送信されます。Request-URIが「%HEXHEX」エンコーディング[42]を使用してエンコードされている場合、オリジンサーバーはリクエストを適切に解釈するためにRequest-URIをデコードする必要があります。サーバーは、無効なRequest-URIに適切なステータスコードで応答する必要があります。
と
「予約済み」および「安全でない」セット(RFC 2396 [42]を参照)以外の文字は、「"%」HEXHEXエンコードと同等です。
(http://trac.tools.ietf.org/wg/httpbis/trac/ticket/2によると、 「安全でない」は間違いであり、仕様から削除されます。したがって、ここでは「予約済み」のみを確認しています。)
参考までに、RFC 2396でのそのような文字の定義:
予約済み=";" | "/" | 「?」| ":" | "@" | "&" | "=" | "+" | "$" | "、"
unreserved = alphanum | マーク
マーク="-"| "_" | 「。」| 「!」| "〜" | "*" | "'" |"( "|") "