Url 确定在查询字符串之前跳过斜杠吗?
追加查询字符串时总是跳过尾部斜杠安全吗 也就是说,我可以使用吗Url 确定在查询字符串之前跳过斜杠吗?,url,query-string,Url,Query String,追加查询字符串时总是跳过尾部斜杠安全吗 也就是说,我可以使用吗 http://example.com?querystring 而不是: http://example.com/?querystring ??我使用过的所有Web主机都支持此方法,但假设所有服务器环境都支持此方法是否安全?它是标准的吗?否。跳过斜杠是不正确的。它可能适用于现代浏览器:但是,这并不意味着它是正确的 看到和 按照RFC1738的格式(我在这里排除了模式格式): //:@:/ 它接着指出: …主机(或端口)和url路径
http://example.com?querystring
而不是:
http://example.com/?querystring
??我使用过的所有Web主机都支持此方法,但假设所有服务器环境都支持此方法是否安全?它是标准的吗?否。跳过斜杠是不正确的。它可能适用于现代浏览器:但是,这并不意味着它是正确的 看到和 按照RFC1738的格式(我在这里排除了模式格式): //:@:/ 它接着指出: …主机(或端口)和url路径之间的“/”不是url路径的一部分 在这种情况下,“?”是url路径的一部分 …取决于使用的方案,以及解释方案的方式 还要注意的是,根据规范,省略“/url路径”是完全有效的——注意“/”在本例中是显式包含的 因此,“foo.com?bar”是无效的,因为url路径前面没有“/”。这样假设是不安全的。Web服务器和自包含的Web应用程序通常会检查请求中提供的URL,但不能保证它们将
/abc
等同于/abc/
。Web服务器和自包含的Web应用程序可以利用从URL收集的信息做任何他们喜欢做的事情,而这不一定是您所期望的。您必须了解特定URL的约定是什么
当然,请注意,大多数web服务器和web应用程序框架都努力接受各种输入,并适当地处理它们。因此,在大多数情况下,web服务器或自包含web应用程序将
/abc
视为等同于/abc/
。但是请记住,因为服务器可以对路径执行任何它喜欢的操作,所以这只是一个一般性的观察,可能有许多例外情况。在接受的答案中添加了我在研究此问题后发现的更多信息:
授权组件前面有一个双斜杠“/”,并以下一个斜杠“/”、问号“?”或URI结尾终止。在authority组件中,保留字符“;”、“:”、“@”、“?”和“/”
基于此语句,问号应表示权限组件的结尾,带斜杠或不带斜杠
(更换标签)
{path}是可选的,{searchpart}及其前面的“?”也是可选的。如果既不存在{path}也不存在{searchpart},也可以省略“/”
但是,该语句表示,只有在路径和searchpart都未预设的情况下,才可以省略尾随斜杠
在现实世界中,我以前可以在查询值之前省略一个尾随斜杠,但最近发现一种情况是向下的。如果您有这样的查询,并且您在Internet Explorer中查看html页面,则该链接将由IE修复。如果您随后单击“文件”、“发送”、“通过电子邮件页面…”,则该链接将以无效格式添加到电子邮件中。问题因查询值的内容而异,但我们能够创建无效的URL
总之,它应该可以工作,但在边缘情况下会下降。根据现代规范,是的,可以跳过斜杠,这与此处所述相反 虽然公认的答案正确地引用了RFC 1738(20多年前发布!),但它错误地宣称RFC 2396(1998年发布)需要斜杠,并忽略了这两个规范已被淘汰,分别于2005年发布(仍在公认答案编写前几年)和最近由,两者都允许省略斜杠
让我们依次考虑这些规范,从最早到最新:
(1994年发布) 隐式要求包含斜杠(此处称为
searchpart
)。下面的黑体字是我的:
HTTP URL的形式如下:
http://<host>:<port>/<path>?<searchpart>
而hier\u部分
如下所示:
net\u路径
如下所示:
其中,abs\u路径
依次定义为以斜杠开始。注意,abs\u路径
在上面的语法中是可选的-这意味着scheme://authority?query
完全合法
附录中暗示了这一变化的动机:
已从允许的字符集中删除问号“?”字符
自测试后,权限组件中userinfo的字符
显示了许多应用程序将其视为用于分离
从URI的其余部分查询组件
换句话说,真实世界中的代码假设URL中的第一个问号(任意位置)标记了查询字符串的开头,因此规范实际地进行了更新,以符合实际情况
(2005年发布;“淘汰”RFC 2396) 同样,可以省略斜杠。规范表示,每个包含授权(主机)的URI中都需要一个“路径”,该路径必须以斜杠开头或不包含任何字符: 通用URI语法由一个层次化的 被称为方案、权限、路径、查询和 碎片
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
方案和路径组件是必需的,尽管路径可能是
空(无字符)。当权限存在时,路径必须
可以为空,也可以以斜杠(“/”)字符开头
为完整起见,请注意,path abempty
后面的定义如下:
这确实允许它不包含任何字符
WhatWG(积极维护的生活标准,2012年首次创建,目标是淘汰RFC 3986) 同样,省略斜杠是可以接受的,尽管这次我们使用了h
hier_part = ( net_path | abs_path ) [ "?" query ]
net_path = "//" authority [ abs_path ]
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
path-abempty = *( "/" segment )