URL的正斜杠通常是什么意思?

例如:


http://www.example.com/A/B//C/
指的是http:之后的开头。

#1 楼

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



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

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

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

评论


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

– josh3736
2011-1-27 21:29



#2 楼

如@RandomBen所述,双斜杠很可能是某处错误的结果。

该页面加载与浏览器无关,而是服务器忽略了多余的斜杠。浏览器对URL中的多余斜杠没有做任何特殊的事情,它只是在请求中发送它们:

两者都将在解析路径时忽略多余的斜杠,并返回如果URL没有多余的斜杠将返回的文档。但是,浏览器(我测试过IE 8和Chrome 9)被页面中资源的任何相对URL(包含父路径组件)弄糊涂了,从而导致不良结果。例如,如果页面具有:

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


在加载页面/a/b/c/时,浏览器将请求/a/style.css。但是,如果出于某种原因而请求/a/b//c/(服务器忽略了多余的斜杠),浏览器最终将请求/a/b/style.css,该请求将不存在。糟糕,页面看上去很丑。

(如果URL没有父路径组件(..)或是绝对路径,则显然不会发生这种情况。)

它我认为Apache和IIS(可能还有其他)的行为不正确,因为/a/b/c//a/b//c/从技术上讲代表两种不同的资源。根据RFC 2396,每个斜杠都是有效的:

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


因此,/a/b/c/包含三个部分:“ a”,“ b”和“ c”; /a/b//c/实际上由四个组成:“ a”,“ b”,“”(空字符串)和“ c”。空字符串是否是有效的文件系统目录是服务器平台的详细信息。 (从逻辑上讲,这意味着浏览器在解析带有父路径组件的相对URL时实际上在正确运行-在我的示例中,它们经过“ c”目录和“”目录,使我们向“ b”请求style.css。 )

如果您将Apache与mod_rewrite一起使用,则有一个非常简单的修复方法:

  path          = [ abs_path | opaque_part ]

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

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


这将发出HTTP 301 Moved Permanently重定向,以便将所有双斜杠都去除网址。

评论


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

–穆德莱特(Ward Muylaert)
11年1月28日在0:16

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

–本·霍夫曼
11年1月28日在11:18

这不是不正确的行为:a / b和a // b实际上是两个不同的URL路径,但是如果有需要的话,没有什么可以阻止服务器为它们返回相同的资源。但是,我确实同意您的观点,实际上返回301重定向似乎更有用。

–伊尔马里·卡洛宁(Ilmari Karonen)
2012年4月9日在19:44



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

– josh3736
2012年4月9日在20:14

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

– josh3736
2012年4月9日在20:21

#3 楼

在资源URL中使用双斜杠时具有含义。例如,当CSS背景中的用户使用CSS作为背景图片的网址时:本网页的内容。换句话说,在资源URL中使用http://时,可以将其写为//

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

评论


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

– andrej
16年5月14日在17:33

#4 楼

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

如果要忽略域名后的双斜杠,则可以使用以下内容:

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


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