[解決済み] HTTP URL のパス部分にあるスラッシュ ("/") は、エンコードされたスラッシュ ("%2F") と同じですか?
質問
URL のパス部分 (クエリ文字列ではない) で "/" と "%2F" を異なるものとして扱っているサイトがあります。 これは、RFC または現実世界のいずれかに従って行うには悪いことですか?
私が質問するのは、使用している Web フレームワーク (Ruby on Rails) とその下のレイヤー (Passenger, Apache, 例: Apache で "ALLOW_ENCODED_SLASHES" を有効にしなければならない) で小さな驚きに遭遇し続けるからです。 私は現在、エンコードされたスラッシュを完全に取り除く方向に傾いていますが、エンコードされたスラッシュを含む奇妙な動作を見た場合、バグ レポートを提出すべきかどうか疑問に思っています。
そもそもなぜエンコードされたスラッシュを持っているかというと、基本的に私はこのようなルートを持っています。
:controller/:foo/:bar
ここで、:fooはスラッシュを含むことができるパスのようなものです。 一番簡単なのは、URLエスケープを行うことだと思いました。
foo
を URL エスケープして、ルーティング メカニズムによってスラッシュが無視されるようにすることです。 今、私は疑問を持っていて、フレームワークがこれを本当にサポートしていないことは明らかですが、RFCによると、この方法で行うことは間違っているのでしょうか?
以下は、私が収集したいくつかの情報です。
RFC 1738 (URL)です。
通常、URLはオクテットが文字で表されるときと、エンコードされるときとで同じ解釈をします。しかし、予約文字についてはそうではありません。特定のスキームで予約された文字をエンコードすると、URL のセマンティクスが変更されることがあります。
RFC 2396 (URI)を参照してください。
これらの文字は、URIコンポーネント内での使用が予約された目的に限定されるため、"reserved"と呼ばれています。URIコンポーネントのデータが予約された目的と衝突する場合、URIを形成する前に衝突するデータをエスケープする必要があります。
(ここでのエスケープは、予約された文字をエンコードする以外のことを意味するのでしょうか?)
rfc 2616 (http/1.1) を参照してください。
reserved" と "unsafe" のセット以外の文字 (RFC 2396 [42] 参照) は、その ""%" HEX HEX" エンコーディングと同じになります。
また このバグレポート があり、そこではエンコードされたスラッシュが異なる振る舞いをすることが期待されているようです。
そうですね、異なるリソースを指しているので、異なる結果を期待しています。
これは、ルートディレクトリにあるリテラルファイル 'foo/bar' を探しています。エスケープされていないバージョンは、ディレクトリ foo 内のファイル bar を探しています。
RFC から、raw と encoded が予約されていない文字と同等であることは明らかですが、予約された文字についてはどうなのでしょうか?
どのように解決するのですか?
収集したデータから、URI でエンコードされた "/" は、アプリケーション/cgi レベルで再度 "/" として見られることを意味していると言えるでしょう。
つまり、もしあなたが apache で
mod_rewrite
を使っている場合、エンコードされたスラッシュを含む URI に対してスラッシュを期待するパターンをマッチさせないということです。
しかし、適切なモジュール/cgi/...がリクエストを処理するために呼び出されると、デコードを行い、例えば、URIの最初のコンポーネントとしてスラッシュを含むパラメータを取得するのは、モジュール次第となるのです。
アプリケーションがこのデータを使ってファイル (ファイル名がスラッシュを含む) を取得する場合、それはおそらく悪いことです。
要約すると、"/" と "%2F" の解釈は異なるレベルで行われるため、動作の違いを見ることは完全に正常であると私は考えています。
関連
-
[解決済み] ExpressJSのX-Powered-Byを削除する方法 [重複]。
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] PHPで完全なURLを取得する
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み] URIクエリで何が有効で何が無効なのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.lang.NoClassDefFoundError: クラスを初期化できませんでした エラーの理由
-
[解決済み] HTTP_CLIENT_IPとHTTP_X_FORWARDED_FORの違いは何ですか?
-
[解決済み] プロキシが全く応答を受け取らない場合、502 HTTPステータスコードを使用すべきですか?
-
[解決済み] HTTPファイルアップロードの仕組みを教えてください。
-
[解決済み] Firefoxで突然「Blocked loading mixed active content」問題が発生したのはなぜですか?
-
[解決済み】BASIC認証でWebサイトからユーザーをログアウトさせる方法は?
-
[解決済み】cURLを使用してBasic HTTP認証を正しく定義する方法は?
-
[解決済み】http:// のリンクを全て // に変更することは可能ですか?
-
[解決済み】ダイジェスト認証とベーシック認証の違いは何ですか?
-
[解決済み] HTTPヘッダーの設定