网址查询参数没有值是否有效?


138

网址是否http://example.com/foo?bar有效?

我正在寻找指向某种官方方式的链接。一个简单的是/否答案或传闻证据都不会解决这个问题。


3
除了URI RFC外,我还要指出一个真实的例子。Drupal在某些链接中将这些无价值的查询参数用作缓存清除的一种形式。例如www.google-analytics.com/analytics.js?o490ub或/themes/seven/ie.css?o4eppb。您可能已经知道这一点,但对此可能有些绊脚石。
Elijah Lynn

Answers:


103
  • 对URI RFC有效
  • 您的服务器端框架/代码可能接受

URI RFC没有强制要求查询字符串的格式。尽管已认识到查询字符串通常会携带名称/值对,但并不需要(例如,它通常包含另一个URI)。

3.4。询问

查询组件包含非分层数据,以及路径组件中的数据(第3.3节),用于标识URI方案和命名权限(如果有)范围内的资源。...

...但是,由于查询组件通常用于以“键=值”对的形式携带标识信息,并且一个经常使用的值是对另一个URI的引用,因此...

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

您无法确定所使用的服务器端框架(如果有),但是您的服务器端框架可能会假设查询字符串将始终以名称/值对的形式出现,并且可能会阻塞查询字符串,而不是以该格式(例如?bar)。如果它是您自己的自定义代码来解析查询字符串,则只需确保您处理该查询字符串格式。如果是框架,则需要查阅文档或进行简单测试以查看其处理方式。


7
当没有提供任何值时,ASP.NET MVC(据我所知第4版和第5版)肯定会阻塞:(
AR

2
HTML5 的isindex神奇之处name在于它可以发送不带键值格式的查询字符串stackoverflow.com/a/37579004/895245
Ciro Santilli郝海东冠状病六四事件法轮功

@CiroSantilli乌坎事件2016六四事件法轮功已弃用,不再支持HTML3
Evan Carroll

79

它们是完全有效的。您可以认为它们等同于沉默寡言地站在暴民信使后面的那个大肌肉男。这个人没有名字,也不说话,但是他的存在可以传达信息。


19
流氓肌肉发达的家伙有个名字,你只是不知道。您虽然在参数上知道它,但是它基本上带有一个布尔值(存在,不存在)。
Vlasec

2
描述它的最好方法:)
Mohammad Kermani

1
这个大家伙的名字是Cheich,从星际迷航该赌场抢劫事件:深空9
安东尼拉特利奇

8

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

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

是的,问号后的所有内容均有效。您的服务器可能会有不同的解释,但是,奇怪的是,您可以看到某些语言将其视为布尔值,如果列出,则为true。


6
有关正式定义,请参阅RFC 2396(ietf.org/rfc/rfc2396.txt),除了指定合法的字符集和具有特殊含义的字符外,它对查询字符串的内容保持沉默。具体来说,它说“查询组件是由资源解释的一串信息”,这意味着其定义取决于协议,因此,键=值在很大程度上符合惯例。
RobertB 2010年

6

是的,它是有效的。

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


4

URI规范

在URI规范的唯一相关的部分是要知道一切的第一间?和第一#查询的符合规范的定义。它可以包含任何字符,例如[:/.?]。这表示查询字符串(例如?bar?ten+green+apples)有效。

这里找到RFC 3986

HTML规范

isindex 不是有意义的HTML5。

建议将其提供为仅用作表单中的第一个元素,并且不带名称提交。

如果该条目的名称是“ isindex”,其类型是“ text”,并且这是表单数据集中的第一个条目,则将值附加到结果上,并跳过该条目的其余子步骤,然后转到下一个条目(如果有),否则进入整个算法的下一步。

isindex标志仅用于旧版。符合HTML文档的表单不会生成需要使用此标志集进行解码的有效负载。

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

图书馆支持

库中对此URI格式的支持各不相同,但是某些库确实提供了旧版支持以简化isindex

Perl URI.pm(特殊支持)

一些库(如Perl的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

isindexnameHTML5 弃用的魔术

此不推荐使用的功能允许表单提交生成这样的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//stackoverflow.com/a/41689431/895245


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);

exampleQueryStringfalse如果函数无法找到查询字符串,否则会true

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.