Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Url 确定在查询字符串之前跳过斜杠吗?_Url_Query String - Fatal编程技术网

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 )