如果一个URL查询参数没有值,它是否有效?

207

http://example.com/foo?bar 这样的 URL 是否有效?

我正在寻找一些官方的链接,以确定该问题的答案。简单的肯定或否定的回答,或是个人经验都不能解决我的问题。


3
除了URI RFC之外,我想指出一个现实世界的例子。Drupal在一些链接中使用这些没有值的查询参数作为缓存清除的一种形式。例如,www.google-analytics.com/analytics.js?o490ub或/themes/seven/ie.css?o4eppb。你可能已经知道这一点,但有些人可能不知道。 - Elijah Lynn
9个回答

153
  • 符合URI RFC规范
  • 可能被你的服务器端框架/代码所接受

URI RFC并没有规定查询字符串的格式。尽管人们通常会使用查询字符串携带名称-值对,但这并不是必需的(例如,它通常会包含另一个URI)。

第3.4节 查询

查询组件包含非层次化数据,与路径组件中的数据一起,用于标识范围在URI方案和命名机构(如果有)内的资源。......

......然而,由于查询组件经常用于携带“key=value”对形式的标识信息,而且经常使用的一个值是对另一个URI的引用,...

HTML规定,通过HTTP GET提交的表单应该将表单值编码为名称-值对形式,如“?key1=value1&key2=value2...”(正确编码)。查询字符串的解析由服务器端代码处理(例如Java servlet engine)。

您没有说明您使用哪个服务器端框架,但是您使用的服务器端框架可能会假定查询字符串始终是名称-值对,并且可能会因不符合该格式的查询字符串(例如?bar)而发生错误。如果是您自己定制的代码解析查询字符串,则必须确保处理该查询字符串格式。如果是框架,则需要查阅文档或进行测试以了解其处理方式。


11
据我所知,ASP.NET MVC(版本4和5)在没有提供值时肯定会出现问题:( - A.R.
2
HTML5中的isindex魔法name允许发送不带键值格式的查询字符串。https://dev59.com/bG455IYBdhLWcg3wD_6Z#37579004 - Ciro Santilli OurBigBook.com

146

它们是完全有效的。你可以认为它们相当于站在黑帮信使后面静默的大块头汉子。这位汉子没有名字,也不说话,但他的存在本身就传递了信息。


42
黑帮大佬的壮汉有个名字,只是你不知道。不过在参数上你会知道它,并且它基本上承载着一个布尔值(存在、不存在)。 - Vlasec
3
最好的描述方式 :) - Mohammad Kermani
3
大个子的名字是 Cheich,在《星际迷航:深空九号》的赌场抢劫剧集中出现过。 - Anthony Rutledge

12

"http"方案用于通过HTTP协议定位网络资源。本节定义了http URL的特定方案语法和语义。"http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

所以,是的,在问号后面可以放任何内容。尽管你的服务器可能会有不同的解释,但是据说,有些语言将其视为布尔值,如果列出了内容,则为true。


7
有关正式的定义,请参阅RFC2396(http://www.ietf.org/rfc/rfc2396.txt),但其中对查询字符串的内容没有作出具体规定,只指定了合法字符集和那些具有特殊意义的字符。具体来说,它指出“查询分量是一串待由资源解释的信息”,这表明其定义取决于协议,因此_key=value_在很大程度上是按照惯例而定的。 - RobertB

9

是的,这是有效的。

如果只想检查参数是否存在,这是一种方法。


6

URI规范

URI规范中唯一相关的部分是要知道第一个?和第一个#之间的所有内容都符合规范对查询的定义。它可以包含任何字符,例如[:/.?]。这意味着查询字符串如?bar?ten+green+apples是有效的。

在此处查找RFC 3986

HTML规范

isindex在HTML5中没有实际含义。

它被弃用,仅供作为表单中的第一个元素使用,并且提交时没有名称。

如果条目名称为“isindex”,其类型为“text”,并且这是表单数据集中的第一个条目,则将该值附加到结果并跳过此条目的其余子步骤,继续前进到下一个条目(如果有)或整体算法中的下一步骤。

isindex标志仅用于遗留用途。符合HTML规范的文档中的表单不会生成需要使用此标志解码的有效负载。

isindex上次受支持是在HTML3中。在HTML5中使用它是为了提供更简单的向后兼容性。

库中的支持

对于此格式的URI,库中的支持因库而异,但某些库确实提供了对isindex的遗留支持,以便更轻松地使用。

Perl URI.pm(特殊支持)

Perl's URI这样的库提供了解析这些结构的方法。

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(无特殊支持)

作为另一个更常见的例子,node.js 采用正常路线,简化解析方式,可以作为:

  • 字符串
  • 或者,键值对的对象(使用 parseQueryString

大多数其他 URI 解析 API 都遵循类似的方式。


3

isindex在HTML5中已被弃用,具有神奇的name

这个被弃用的特性允许表单提交生成这样一个URL,进一步证明它对于HTML是有效的。例如:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

生成类型为URL的链接:
?bar

标准:https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindex已被废弃,如https://dev59.com/bG455IYBdhLWcg3wD_6Z#41689431中所述。


3

2
请注意,RFC 2396“修订并替换了RFC 1738和RFC 1808中的通用定义。” - RobertB

1
正确的资源查找是RFC6570。请参考第3.2.9节,其中示例中展示了空参数。
 Example Template     Expansion
   {&x,y,empty}       &x=1024&y=768&empty=

1
作为其他答案所述,这对于检查非常有效,特别是对于布尔类型的东西。
这里有一个简单的函数通过名称获取查询字符串:
function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

现在您想要检查您正在查找的查询字符串是否存在,您可以做一些简单的事情,例如:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

如果函数无法找到查询字符串,则exampleQueryString将是false,否则将是true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接