像http://example.com/foo?bar
这样的网址是否有效?
我正在寻找一个官方的链接,说明这种或那种方式。一个简单的是/否答案或轶事证据不会削减它。
答案 0 :(得分:83)
URI RFC不要求查询字符串的格式。虽然可以认识到查询字符串通常带有名称 - 值对,但不需要(例如,它通常包含另一个URI)。
3.4。查询
查询组件包含非分层数据 路径组件中的数据(第3.3节)用于识别a URI的方案和命名权限范围内的资源 (如果有的话)。 ......
...但是,作为查询组件 通常用于携带形式的识别信息 “key = value”对和一个常用值是对的引用 另一个URI,......
HTML确定通过HTTP GET提交的表单应将表单值编码为名称 - 值对,形式为“?key1 = value1& key2 = value2 ...”(正确编码)。解析查询字符串取决于服务器端代码(例如Java servlet引擎)。
您没有确定您使用的服务器端框架(如果有),但您的服务器端框架可能假设查询字符串始终位于名称 - 值对中,并且可能会阻塞查询字符串不是那种格式(例如?bar
)。如果您自己的自定义代码解析查询字符串,您只需确保处理该查询字符串格式。如果它是一个框架,您需要查阅您的文档或只是测试它以查看它是如何处理的。
答案 1 :(得分:65)
他们完全有效。你可以认为它们相当于那些默默地站在暴徒信使身后的肌肉发达的家伙。这家伙没有名字,也没有发言,但他的存在传达了信息。
答案 2 :(得分:7)
“”http“方案用于通过HTTP协议定位网络资源。本节定义了http URL的特定于方案的语法和语义。” http://www.w3.org/Protocols/rfc2616/rfc2616.html
http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
所以是的,任何问题后都有效。您的服务器可能会有不同的解释,但轶事,您可以看到某些语言将其视为布尔值,如果列出则为真。
答案 3 :(得分:5)
是的,它是有效的。
如果只想检查参数是否存在,这是一种方法。
答案 4 :(得分:3)
URI规范中唯一相关的部分是知道第一个?
和第一个#
之间的所有符合规范查询的定义。它可以包含任何字符,例如[:/.?]
。这意味着?bar
或?ten+green+apples
等查询字符串有效。
isindex
没有任何有意义的HTML5。
它提供已弃用,仅用作表单中的第一个元素,并提交没有名称。
如果条目的名称是" isindex",其类型为" text",这是表单数据集中的第一个条目,然后将值附加到结果并跳过此条目的其余子步骤,转到下一个条目(如果有),否则转到整个算法的下一步。
isindex标志仅供传统使用。符合HTML文档的表单不会生成需要使用此标志集进行解码的有效负载。
最后一次isindex was supported was HTML3。它在HTML5中的用途是提供更容易的向后兼容性。
这种URI格式的库支持各不相同,但有些库确实提供了遗留支持以便于isindex
的使用。
像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.
url
(无特别支持)作为另一个更常见的例子,node.js
采用正常路由并简化解析
parseQueryString
)大多数其他URI解析API遵循类似的内容。
parse_url
,遵循类似的实现,但只返回查询的字符串。 Parsing into an object of k=>v
requires parse_string()
答案 5 :(得分:2)
答案 6 :(得分:2)
isindex
允许表单提交生成此类网址,从而进一步证明它对HTML有效。 E.g:
<form action="#isindex" class="border" id="isindex" method="get">
<input type="text" name="isindex" value="bar"/>
<button type="submit">Submit</button>
</form>
生成类型为:
的网址?bar
标准:https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute
isindex
已弃用,如:https://stackoverflow.com/a/41689431/895245
答案 7 :(得分:0)
正如所描述的所有其他答案一样,它对于检查非常有效,特别是对于布尔类型的东西
这是一个通过名称获取查询字符串的简单函数:
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
。