带有多个正斜杠的url,是否会破坏任何东西?
http://example.com/something/somewhere//somehow/script.js
双斜线是否会破坏服务器端的任何内容? 我有一个parsingURL的脚本,我想知道是否会打破任何东西(或更改path),如果我用一个斜杠replace多个斜线。 特别是在服务器端,像CodeIgniter和Joomla这样的框架使用了分段的urlscheme和路由。 我只想知道它是否会破坏任何东西。
HTTP RFC 2396将path分隔符定义为单斜杠 。
但是,除非使用某种URL重写(在这种情况下,重写规则可能会受到斜杠数量的影响),则uri会映射到磁盘上的path,但是在大多数现代操作系统(Linux / Unix,Windows),一行中的多个path分隔符没有任何特殊含义,所以/ path / to / foo和/ path //最终映射到同一个文件。
可能会受到影响的另一件事是caching。 由于浏览器和服务器caching单个页面(根据其caching设置),通过稍微不同的URI请求多次相同的文件可能会影响caching(取决于服务器和客户端的实现)。
URL不必映射到文件系统path。 所以,即使文件系统path中的//等于/,也不能保证所有URL都是一样的。
RFC 2396定义了一个URLpath语法,正如Amn解释的那样,双斜杠在语法上是有效的,意味着一个空的URI段。 但RFC 2396故意不定义任何语义的path,包括空段的语义。 所以在实践中,这个问题的正确答案取决于服务器的实现 !
既然你没有指定涉及哪种服务器技术,对你的问题更有用的答案可能是“也许 – 尝试一下,看看会发生什么!”。
但是,我个人总是尽量避免在URL中使用双斜杠,原因如下:
-
没有人期待,所以会造成错误。 (例子)你的服务器今天可能与它兼容,但是用于重新实现相同服务的下一个服务器技术可能不愿意明天正确实现相同的API(例如,当你尝试时,ASP.NET MVC Web API库会引发错误用双斜线指定路线模板)。
-
更具体地说,一些服务器可能会尝试将其解释为表示与/完全不同的内容(例如,返回到根path)。
-
因此,一些服务器和防火墙因此假设//是利用一个错误 (即一个目录遍历攻击)的尝试,并且甚至在解释URIpath之前给予你前面的
403 Forbidden
。
考虑“RFC3986:统一资源标识符(URI):通用语法”中的相关path-absolute
非terminal的声明(在ABNF语法中典型地指定):
path-absolute = "/" [ segment-nz *( "/" segment ) ]
在相同的文档中再读下面的segment
声明几行应该引导你回答:
segment = *pchar
如果您可以读取ABNF,星号( *
)指定以下元素pchar
可以重复多次以组成一个segment
,包括零次 。 学习这个并重新读上面的path-absolute
声明,你可以看到一个可能的空segment
实现了第二个"/"
可能会无限重复,因此允许有效的组合像//////
(任意长度至less为一/
)作为path-absolute
一部分(其本身用于指定描述URI的规则)。
由于所有的URL都是URI,所以我们可以得出结论:允许URL按引用的RFC多个连续的正斜杠。
但是并不是每个人都遵循或者按照规范来实现URIparsing器,所以我相当确定存在不兼容的URI / URLparsing器,以及在这些angular落案例破坏更大的系统之上堆叠的各种软件。
有一件事你可能要考虑的是它可能会影响你在search引擎中的页面索引。 根据这个网页,
重复3次相同path的url将不会在Google中build立索引
他们使用的例子是:
example.com/path/path/path/
我还没有证实,如果你使用example.com///
,这也是真的,但我一定会想知道SEO优化是否对我的网站至关重要。
他们提到:“这是因为Google认为它已经达到了URL陷阱。” 如果其他人知道答案是肯定的,请为此答案添加评论; 否则,我认为有必要考虑这个案件。
你的问题是“它打破了什么”。 根据URL规范,没有它的作品。 不要阅读RFC,这里是一个快速的实验,你可以尝试:
cat > tmp.php <<'EOF' <?php echo $_SERVER['REQUEST_URI']; EOF php -S localhost:4000 tmp.php
现在打开浏览器到http:// localhost:4000 / hello // world
例如,在您的应用程序中构build资源链接时,您可能会感到惊讶。
<script src="mysite.com/resources/jquery//../angular/script.js"></script>
不会parsing到 mysite.com/resources/angular/script.js
但 mysite.com/resources/jquery/angular/script.js
你可能不想要
双斜线是邪恶的,尽量避免它们。