有多个正斜杠的url,它会破坏什么吗?

时间:2012-04-15 10:22:11

标签: url browser url-routing server-side

http://example.com/something/somewhere//somehow/script.js

双斜杠是否会破坏服务器端的任何内容?我有一个解析URL的脚本,我想知道如果我用一个斜杠替换多个斜杠,它是否会破坏任何东西(或更改路径)。特别是在服务器端,CodeIgniter和Joomla等一些框架使用分段url方案和路由。我只是想知道它是否会破坏任何东西。

8 个答案:

答案 0 :(得分:31)

HTTP RFC 2396将路径分隔符定义为单斜杠

但是,除非你使用某种URL重写(在这种情况下重写规则可能会受到斜杠数量的影响),uri会映射到磁盘上的路径,但在(大多数?)现代操作系统中(Linux / Unix,Windows),连续的多个路径分隔符没有任何特殊含义,因此/ path / to / foo和/ path //到//// foo最终会映射到同一个文件。

可能受影响的另一件事是缓存。由于您的浏览器和服务器都缓存单个页面(根据其缓存设置),通过略微不同的URI多次请求同一文件可能会影响缓存(取决于服务器和客户端实现)。

答案 1 :(得分:11)

网址不必映射到文件系统路径。因此,即使文件系统路径中的//等同于/,也不能保证所有URL都是如此。

答案 2 :(得分:8)

这个问题的正确答案是它取决于服务器的实现

前言:根据RFC 2396定义URL路径语法,双斜杠在语法上是有效的。正如 amn 所解释的那样,它意味着一个空的URI段。但请注意,RFC 2396仅定义语法,而不是路径的语义,包括空路径段,因此由服务器决定空路径的语义

你没有提到你正在使用的服务器软件堆栈,也许你甚至还在自己推出?所以请用你的想象来了解语义是什么!

实际上,我想指出一些日常语义相关的原因,这意味着你应该避免使用双斜线,即使它们语法有效:

  1. 由于每个人都不希望空有效,因此可能会导致错误。即使您今天的服务器技术可能与之兼容,但未来的服务器技术或当今服务器技术的下一版本可能决定不再支持它。示例:当您尝试使用双斜杠指定路由模板时,ASP.NET MVC Web API库会引发错误。

  2. 某些服务器可能会将//解释为指示根路径。这可能是故意的,也可能是错误 - 然后可能是安全漏洞,即目录遍历漏洞。

  3. 因为它有时是一个bug和一个安全漏洞,一些聪明的服务器堆栈和防火墙会看到子串' //',推断你可能会尝试利用这样的错误,因此他们将返回403 Forbidden400 Bad Request等,并拒绝实际进行URI的进一步处理。

答案 3 :(得分:1)

考虑non-terminal中相关path-absolute "RFC3986: Uniform Resource Identifier (URI): Generic Syntax"的声明(通常在ABNF语法中指定):

path-absolute = "/" [ segment-nz *( "/" segment ) ]

然后在同一文档中进一步考虑segment声明几行:

segment       = *pchar

如果您可以阅读ABNF,则星号(*)指定可以多次重复以下元素pchar以构成segment,包括零次< / em>的。通过学习并重新阅读上面的path-absolute声明,您可以看到第二个segment可能无限期重复的潜在空"/"实现,因此允许有效//////之类的组合(至少一个/的任意长度)作为path-absolute的一部分(其本身用于指定描述URI的规则)。

由于所有URL都是URI,我们可以得出结论是,每个引用的RFC允许URL多个连续正斜杠。

但是并不是每个人都遵循或实现每个规范的URI解析器,所以我很确定有不兼容的URI / URL解析器和各种类型的软件堆叠在这些角落的情况下会破坏更大的系统。 / p>

答案 4 :(得分:1)

您可能想要考虑的一件事是可能会影响您在搜索引擎中的网页索引。根据{{​​3}}网页,

  

重复3次相同路径的网址不会在Google

中编入索引

他们使用的例子是:

example.com/path/path/path/

如果您使用example.com///,我还没有确认这也是正确的,但我肯定想知道SEO优化是否对我的网站至关重要。

他们提及&#34;这是因为Google认为它已经遇到了网址陷阱。&#34;如果其他人确切知道答案,请在此答案中添加评论;否则,我认为将此案件纳入考虑是相关的。

答案 5 :(得分:1)

是的,它绝对可以破坏一切。

该规范认为http://host/pages/foo.htmlhttp://host/pages//foo.html是不同的URI,服务器可以自由为其分配不同的含义。但是,大多数服务器将对路径/pages/foo.html/pages//foo.html进行相同处理(因为基础文件系统也是如此)。但是,即使在处理此类服务器时,也很可能会出现多余的斜线来破坏事情。考虑服务器返回相对URI的情况。

http://host/pages/foo.html  + ../images/foo.png = http://host/images/foo.png
http://host/pages//foo.html + ../images/foo.png = http://host/pages/images/foo.png

让我解释一下这是什么意思。假设您的服务器返回了包含以下内容的HTML文档:

<img src="../images/foo.png">

如果您的浏览器使用以下方式获取了该页面

http://host/pages/foo.html          # Path has 2 segments: "pages" and "foo.html"

您的浏览器将尝试加载

http://host/images/foo.png          # ok

但是,如果您的浏览器使用

http://host/pages//foo.html         # Path has 3 segments: "pages", "" and "foo.html"

您可能会得到相同的页面(因为服务器可能无法将/pages//foo.html/pages/foo.html区别开来),但是您的浏览器会错误地尝试加载

http://host/pages/images/foo.png    # XXX

答案 6 :(得分:0)

例如,在您的应用中构建资源链接时,您可能会感到惊讶。

<script src="mysite.com/resources/jquery//../angular/script.js"></script>

无法解析为 mysite.com/resources/angular/script.js ,但 mysite.com/resources/jquery/angular/script.js 您可能不想要 < / p>

双斜线是邪恶的,尽量避免它们。

答案 7 :(得分:-1)

你的问题是“它是否会破坏任何东西”。就URL规范而言,允许使用额外的斜杠。不要阅读RFC,这是一个快速的实验,您可以尝试查看您的浏览器是否默默地破坏了URL:

echo '<?= $_SERVER['REQUEST_URI'];' > tmp.php                                   
php -S localhost:4000 tmp.php

我使用Safari 12.0(14606.1.36.1.9)和Chrome 69.0.3497.100测试了macOS 10.14(18A391),两者都得到了结果:

  

/你好//世界

这表明使用额外的斜杠 对Web应用程序可见。

使用双斜杠时,某些用例将被破坏。这包括期望单个斜线URL的URL重定向/路由或直接分析URI的其他CGI应用程序。

但是对于提供静态内容的正常情况,例如您的示例,这仍然会获得正确的内容。但客户端将使用不同的斜杠访问相同的内容,从而获得缓存未命中。