web-dev-qa-db-ja.com

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

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

例えば:

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

http:の直後の始まりを参照していないことに注意してください。

32
aneuryzm

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

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

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

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

32
Ben Hoffman

@ RandomBen で述べたように、ダブルスラッシュはおそらくどこかのエラーの結果です。

ページがロードされることはbrowserとは関係ありませんが、serverは余分なスラッシュを無視します。ブラウザは、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を要求することになりますが、これは存在しません。おっと、ページがlooksいように見えます。

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

/a/b/c//a/b//c/は技術的に2つの異なるリソースを表しているため、ApacheとIIS(およびおそらくその他)が誤って行動していると思います。 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/は、実際には4つの「a」、「b」、「」(空の文字列)、および「c」で構成されています。空の文字列が有効なファイルシステムディレクトリであるかどうかは、サーバーのプラットフォームの詳細です。 (論理的には、これは、親パスコンポーネントを使用して相対URLを解析するときに、ブラウザが実際に動作している正しくことを意味します。 「ディレクトリ」と「」ディレクトリ。「b」からstyle.cssをリ​​クエストする必要があります。)

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

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

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

33
josh3736

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

__コードスニペット__

ここでは、この背景画像が現在のWebページのドメイン以外の別のドメインから取得していることを意味します。または、言い換えると、リソースURLで.classname { background : url("//example.com/a/b/c/d.png"); } を使用するときはhttp://を単に//として書くことができます。

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

4
Alan Joseph

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

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

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

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

2
orlade