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

Jos*_*eph 34 browser url server-side url-routing

http://example.com/something/somewhere//somehow/script.js
Run Code Online (Sandbox Code Playgroud)

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

pon*_*cha 33

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

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

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

  • 这是一个很好的答案!遗憾的是它是https:///stackoverflow.com////////a/////10161264/////6618577的重复... (9认同)
  • @amn 这是有效的,这里没有问题。但问题是它是否能破坏任何东西。它可能 - 如果你使用 URL 重写(例如) (2认同)
  • 重新“*除非您使用某种 URL 重写*”,这对于相对 URL 也很重要。`http://host/a/b/c/d + ../../e = http://host/a/e`,而`http://host/a/b/c//d + ../../e = http://host/a/b/e` (2认同)

Red*_*ick 12

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


Tim*_*ith 9

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

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

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

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

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

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

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