Answers:
如@RandomBen所述,双斜杠很可能是某处错误的结果。
页面加载与浏览器无关,而是服务器忽略了多余的斜杠。浏览器对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
,该请求将不存在。糟糕,页面看上去很丑。
(如果该网址没有父路径组件(..
)或是绝对路径,则显然不会发生这种情况。)
我认为Apache和IIS(可能还有其他)的行为不正确,/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/
由三个部分组成:“ a”,“ b”和“ c”;/a/b//c/
实际上由四个组成:“ a”,“ b”,“”(空字符串)和“ c”。空字符串是否是有效的文件系统目录是服务器平台的详细信息。(从逻辑上讲,这意味着浏览器在解析带有父路径组件的相对URL时实际上在正确运行 -在我的示例中,它们经过“ c”目录和“”目录,使我们可以向style.css
“ b” 提出请求。)
如果您将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中使用双斜杠时有含义。例如,当它是CSS中用户的背景图片网址时:
.classname {
background : url("//example.com/a/b/c/d.png");
}
在这里,这意味着该背景图像是从不同于当前网页域的其他域中获取的。换句话说,http://
可以将其写成//
在资源URL中使用时的形式。
但是,URL之间的双斜杠(例如/a//b/c/d.htm
:)没有任何意义。
如前所述,某些服务器设置为忽略URL路径中的双斜杠,但Amazon S3静态托管不会。如果要在这种情况下处理/忽略它们,则可以在属性面板中使用“ 重定向规则”。
如果您想忽略域名后面的双斜杠,则可以使用如下代码:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
您可能还可以在整个过程中找到并替换它们,但这对我来说已经足够。