URL中的双斜杠是什么意思?


32

URL的中间经常出现双斜杠到底是什么意思?

例如:

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

请注意,我指的不是紧接着的开始http:

Answers:


32

那是程序员/开发人员代码中的错误。如果比较这两个URL:

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

它们看起来不一样,但是如果您要访问任何一个,它们都可以在大多数现代浏览器中使用。

这是您要修复的问题。如果您使用双斜杠,则可能会使Google的网络抓取工具感到困惑,并使他们认为该页面有2个版本。


11
实际上,页面加载与浏览器无关,而是服务器忽略了多余的斜杠。这很长,因此请参阅我发布的答案
josh3736 2011年

33

@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中删除所有双斜杠。


2
让您的mod_rewrite解决方案也考虑3、4,...斜线不是更好吗?有什么类似的/{2,}?(假设Apache允许使用这种量词,我对此不太熟悉)
Ward Muylaert

+1-感谢您提供更多信息。我没有那样想!
Ben Hoffman

3
这不是不正确的行为:a/ba//b确实是两个不同的URL路径,但没有从返回相同的资源对他们俩的,如果它要禁止的服务器。但是,我确实同意您的观点,实际上返回301重定向似乎更有用。
Ilmari Karonen'4

4
@IlmariKaronen:这绝对是不正确的行为,因为(1)此行为会自动创建对单个资源的无限数量的潜在重复引用(如果不违反任何规范的文字,肯定会违反其精神),并且实际上更是如此(2)它会“破坏”浏览器中的相对路径处理,这些浏览器确实将空字符串计入a//b目录(请参见上面的样式表示例)。
josh3736'4

1
...而且无论如何,我认为RFC 2396 确实禁止服务器通过自动折叠斜杠来返回相同的资源,因为该规范说每个斜杠都是重要的。自动忽略连续的斜杠违反了该规范。(如果有人对服务器进行编程,即使这样做很愚蠢,这
一回事

4

在资源URL中使用双斜杠时有含义。例如,当它是CSS中用户的背景图片网址时:

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

在这里,这意味着该背景图像是从不同于当前网页域的其他域中获取的。换句话说,http://可以将其写成//在资源URL中使用时的形式。

但是,URL之间的双斜杠(例如/a//b/c/d.htm:)没有任何意义。


好吧,这不是全部。当需要避免混合内容问题时,将使用双斜杠。因此,从http加载站点时,双斜杠将扩展为http;从https加载站点时,双斜杠将扩展为https。
andrej

2

如前所述,某些服务器设置为忽略URL路径中的双斜杠,但Amazon S3静态托管不会。如果要在这种情况下处理/忽略它们,则可以在属性面板中使用“ 重定向规则”

如果您想忽略域名后面的双斜杠,则可以使用如下代码:

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

您可能还可以在整个过程中找到并替换它们,但这对我来说已经足够。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.