回答:
それはプログラマー/開発者のコードのエラーです。これら2つのURLを比較する場合:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
見た目は異なりますが、どちらかにアクセスすると、両方とも最新のブラウザで動作します。
これは修正したいものです。ダブルスラッシュがあると、GoogleのWebクローラーを混乱させ、ページの2つのバージョンがあると思わせる可能性があります。
@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から二重スラッシュが削除されます。
mod_rewrite
ソリューションに3、4、...のスラッシュも考慮に入れた方が良いと思いませんか?の線に沿って何か/{2,}
?(Apacheがそのような量指定子を許可していると仮定すると、私はそれにあまり詳しくありません)
a/b
とa//b
確かに二つの異なるURLパスがありますが、何もそれは望んでいる場合は、それらの両方に同じリソースを返すからサーバーを禁止していません。ただし、実際には301リダイレクトを返す方が便利だと思われます。
a//b
ディレクトリとして適切にカウントするブラウザの相対パス処理を「中断」します(上記のスタイルシートの例を参照)。
二重スラッシュは、リソースURLで使用される場合に意味があります。たとえば、背景画像のURLのCSSのユーザーの場合:
.classname {
background : url("//example.com/a/b/c/d.png");
}
ここでは、この背景画像が現在のWebページのドメイン以外の別のドメインから取得していることを意味します。または、言い換えれば、リソースURLでそれを使用するときのhttp://
ように書くことができ//
ます。
しかし、URLの間にあるこの二重スラッシュ(例:)には/a//b/c/d.htm
意味がありません。
前述のように、一部のサーバーはURLパスの二重スラッシュを無視するようにセットアップされていますが、Amazon S3の静的ホスティングはそうではありません。その場合にそれらを処理/無視する場合は、プロパティパネルでリダイレクトルールを使用できます。
ドメイン名に続く二重スラッシュを無視する場合は、次のようなものを使用できます。
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
おそらくそれらを見つけて交換することもできますが、それで十分でした。