URLで二重スラッシュは何を意味しますか?


32

URLでよく見られるダブルスラッシュとはどういう意味ですか?

例えば:

  • http://www.example.com/A/B//C/

直後の始まりに言及していないことに注意してくださいhttp:

回答:


32

それはプログラマー/開発者のコ​​ードのエラーです。これら2つのURLを比較する場合:

  • http://www.example.com/A/B/C/
  • http://www.example.com/A/B//C/

見た目は異なりますが、どちらかにアクセスすると、両方とも最新のブラウザで動作します。

これは修正したいものです。ダブルスラッシュがあると、GoogleのWebクローラーを混乱させ、ページの2つのバージョンがあると思わせる可能性があります。


11
実際、ページがロードされることはbrowserとは関係ありませんが、サーバーは余分なスラッシュを無視しますこれは長くなりましたので、私が投稿した答えをご覧ください。
josh3736

33

@RandomBenで述べたように、二重スラッシュはどこかのエラーの結果である可能性が高いです。

ページがロードされることはbrowserとは関係ありませんが、サーバーは余分なスラッシュを無視します。ブラウザは、URLに余分なスラッシュを追加して特別なことを行うことはせず、リクエストでそれらを一緒に送信します。

GET /A/B//C/D HTTP/1.1
Host: www.example.com
...

現在のバージョンのApacheとIISは、パスを解決するときに余分なスラッシュを無視し、URLに余分なスラッシュがない場合に返されるはずのドキュメントを返します。 ただし、ブラウザー(IE 8とChrome 9をテストしました)は、ページ内のリソースの相対URL(親パスコンポーネントを含む)によって混乱し、悪い結果をもたらします。たとえば、ページに次のものがある場合:

<link rel="stylesheet" href="../../style.css" type="text/css" />

ページをロードする/a/b/c/と、ブラウザが要求し/a/style.cssます。しかし、/a/b//c/(何らかの理由で)要求された場合(およびサーバーが余分なスラッシュを無視する場合)、ブラウザーはを要求/a/b/style.cssすることになり、これは存在しません。おっと、ページがいように見えます。

(URLに親パスコンポーネント(..)がない場合、または絶対パスである場合、これは明らかに発生しません。)

私の意見では、ApacheとIIS(およびおそらく他の)は、2つの異なるリソースとして正しく機能せ/a/b/c/ず、/a/b//c/技術的にはそれらを表しています。RFC 2396によると、すべてのスラッシュは重要です。

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

したがって、/a/b/c/3つのセグメントで構成されます: "a"、 "b"、および "c"。/a/b//c/実際には、「a」、「b」、「」(空の文字列)、および「c」の4つで構成されます。空の文字列が有効なファイルシステムディレクトリであるかどうかは、サーバーのプラットフォームの詳細です。(論理的には、これは親パスコンポーネントを含む相対URLを解析するときにブラウザーが実際に正しく動作していることを意味します。この例では、 "c"ディレクトリーと ""ディレクトリーを超えstyle.cssます

でApacheを使用している場合mod_rewrite、かなり簡単な修正があります

# remove multiple slashes anywhere in url 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

これにより、HTTP 301 Moved Permanentlyリダイレクトが発行され、URLから二重スラッシュが削除されます。


2
mod_rewriteソリューションに3、4、...のスラッシュも考慮に入れた方が良いと思いませんか?の線に沿って何か/{2,}?(Apacheがそのような量指定子を許可していると仮定すると、私はそれにあまり詳しくありません)
ワードミュイラト

+1-追加情報をありがとう。私はそのように考えていませんでした!
ベンホフマン

3
そうではありません間違った行動:a/ba//b確かに二つの異なるURLパスがありますが、何もそれは望んでいる場合は、それらの両方に同じリソースを返すからサーバーを禁止していません。ただし、実際には301リダイレクトを返す方が便利だと思われます。
イルマリカロネン

4
@IlmariKaronen:それは絶対にこの動作は(1)ので、不正な動作で自動的に、より実用的に(どんなスペックの手紙に違反して、確かに精神に違反し、そうでない場合は)単一のリソースへの潜在的な重複参照の無限の数を作成し、 (2)空の文字列をa//bディレクトリとして適切にカウントするブラウザの相対パス処理を「中断」します(上記のスタイルシートの例を参照)。
josh3736

1
...とにかく、RFC 2396 、スラッシュが自動的に折りたたまれて同じリソースを返すことをサーバー禁止していると主張するでしょう。連続するスラッシュを自動的に無視することは、その仕様に違反しています。(誰かがそれを行うようにサーバーをプログラムした場合、それはばかげている場合でも1つのことです。ただし、デフォルトこれを行うサーバー正しくありません。)
josh3736

4

二重スラッシュは、リソースURLで使用される場合に意味があります。たとえば、背景画像のURLのCSSのユーザーの場合:

.classname {
    background : url("//example.com/a/b/c/d.png");
}

ここでは、この背景画像が現在のWebページのドメイン以外の別のドメインから取得していることを意味します。または、言い換えれば、リソースURLでそれを使用するときのhttp://ように書くことができ//ます。

しかし、URLの間にあるこの二重スラッシュ(例:)には/a//b/c/d.htm意味がありません。


まあ、これは完全な真実ではありません。混合コンテンツの問題を回避する必要がある場合はダブルスラッシュが使用されます。したがって、httpからサイトが読み込まれると、httpからダブルスラッシュが読み込まれ、httpからサイトが読み込まれると、ダブルスラッシュがhttpsに展開されます。
アンドレジュ

2

前述のように、一部のサーバーはURLパスの二重スラッシュを無視するようにセットアップされていますが、Amazon S3の静的ホスティングはそうではありません。その場合にそれらを処理/無視する場合は、プロパティパネルでリダイレクトルールを使用できます。

ドメイン名に続く二重スラッシュを無視する場合は、次のようなものを使用できます。

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

おそらくそれらを見つけて交換することもできますが、それで十分でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.