http://example.com/something/somewhere//somehow/script.js
请问双斜线打破在服务器端什么? 我有一个解析URL的剧本,我不知道是否会破坏任何东西(或更改路径)如果我换成多个斜线与单斜线。 特别是在服务器端,像笨和Joomla一些框架使用分段的URL方案和路由。 我只是想知道,如果它打破什么。
http://example.com/something/somewhere//somehow/script.js
请问双斜线打破在服务器端什么? 我有一个解析URL的剧本,我不知道是否会破坏任何东西(或更改路径)如果我换成多个斜线与单斜线。 特别是在服务器端,像笨和Joomla一些框架使用分段的URL方案和路由。 我只是想知道,如果它打破什么。
HTTP RFC 2396定义路径分隔为单斜线 。
但是,除非你使用某种URL重写(在这种情况下,重写规则可以由斜线的数量的影响)中,URI映射到磁盘上的路径,但在(大多数?)现代的操作系统(Linux / UNIX,Windows)中,连续多路径分隔符没有任何特殊含义,所以/路径/到/ foo和/路径//到////富最终将映射到相同的文件。
可能受到影响的另外一个事情是缓存。 由于这两种浏览器和服务器缓存单独的页面(根据自己的缓存设置),通过略微不同的URI请求相同的文件多次,可能会影响缓存(取决于服务器和客户端实现)。
网址不必映射到文件系统路径。 因此,即使//在一个文件系统路径相当于/,你不能保证这同样适用于所有URL真。
正确回答这个问题是它依赖于服务器的实现 !
前言:双斜线在语法上是有效的,根据RFC 2396,它定义URL路径语法。 如AMN解释,因此它意味着一个空的URI段。 但是请注意RFC 2396只定义了语法 ,而不是路径语义,包括空的路径段,所以它是由服务器来决定的空路径的语义 。
你没有提到你正在使用的服务器软件栈,也许你连滚你自己? 所以,请用你的想象力,以什么语义可能!
实际上,我想指出,这意味着你应该避免,即使它们是语法上有效的双斜线一些日常语义方面的原因:
由于空是某种不被大家所预期有效,它可能会导致错误。 而且即使今天你的服务器技术,可能是与之兼容,无论是明天的你的服务器技术还是今天的服务器技术的下一个版本可能会决定不向任何更多的支持。 例如:当您尝试指定以双斜线的路由模板ASP.NET MVC的Web API库将抛出一个错误。
有些服务器可能会将//作为指示根路径。 这可以是在用或错误 - 然后有可能是一个安全漏洞,即目录遍历漏洞。
因为它有时是一个错误,和安全漏洞,一些聪明的服务器堆栈和防火墙会看到子“//”,演绎你可能在利用这样的漏洞做出的尝试,因此,他们将返回403 Forbidden
或400 Bad Request
等,并拒绝进行实际的URI的任何进一步的处理。
你可能要考虑的一件事是,它可能会影响你的网页索引的搜索引擎。 根据该网页,
具有相同路径的URL重复3次不会在谷歌索引
他们使用的例子是:
example.com/path/path/path/
我还没有证实,如果你使用的,这也将是真实的example.com///
,但我肯定会想看看SEO优化是为我的网站是至关重要的。
他们提到,“这是因为谷歌认为它已经达到一个URL陷阱”。 如果别人知道了肯定的回答,请加入到这个答案评论; 否则,我认为它有关,包括这种情况下审议。
考虑有关的声明path-absolute
非末端在“RFC3986:统一资源标识符(URI):通用语法” (指定,如典型的是,在ABNF语法):
path-absolute = "/" [ segment-nz *( "/" segment ) ]
再考虑segment
声明中的几行字在同一文件中进一步下跌:
segment = *pchar
如果你可以看到ABNF,星号( *
)指定以下元素pchar
可以重复多次,以弥补segment
,包括零次 。 学习这一点,并重新读取的path-absolute
上面的声明,可以看到,潜在的空segment
imples第二"/"
可无限重复,因此允许像有效组合//////
(至少一个的任意长度/
)作为其一部分path-absolute
(其本身在指定描述URI规则)使用。
由于所有的URL都是URI,我们可以得出这样的结论是,网址是允许多个连续的斜杠,每引用RFC。
但它不喜欢每个人都遵循或按规格实现URI解析器,所以我相当肯定有不符合规定的URI / URL解析器和各类上的这些顶级栈,其中这样极端案例打破更大的系统软件。
是的,它可以最肯定破事。
该规范认为http://host/pages/foo.html
和http://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
在您的应用程序建立链接的资源时,你会感到惊奇例如。
<script src="mysite.com/resources/jquery//../angular/script.js"></script>
不会解决到 mysite.com/resources/angular/script.js
但 mysite.com/resources/jquery/angular/script.js
你可能不想要什么
双斜线是邪恶的,尽量避免它们。
你的问题是“它破坏任何东西。” 在URL规范而言,多余的斜线是允许的。 不读RFC,这里是一个快速的实验中,你可以尝试看看,如果你的浏览器默默轧液的网址:
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应用程序。
但是,对于提供静态内容的正常情况下,如你的榜样,这仍然会得到正确的内容。 但是,客户端将得到针对不同的斜线访问相同内容高速缓存未命中。