使用没有值的GET参数(在URL中)是一种不好的做法吗?


Is it a bad practice to use a GET parameter (in URL) with no value?

我和我的老板关于使用无值GET参数的url有一点争论。例如

http://www.example.com/?logout

我在网上经常看到这种链接,当然,这并不意味着这是一件好事。他担心这是不标准的,可能会导致意想不到的错误,所以他更希望我使用这样的内容:

http://www.example.com/?logout=yes

在我的经验中,我从来没有遇到过使用空参数的任何问题,它们有时对我更有意义(就像在这种情况下,?logout=no不会有任何意义,所以"logout"的值是无关紧要的,我只会测试参数服务器端的存在,而不是它的值)。(它看起来也更干净。)

然而,我无法确认这种用法实际上是有效的,因此真的不会引起任何问题。

你有关于这个的链接吗?

RFC 2396, "统一资源标识符(URI):通用语法",§3.4,"查询组件"是查询字符串信息的权威来源,并声明:

查询组件是要解释的信息字符串资源。

[…]

查询组件内,字符 ";", "/", "?", ":", "@","&","=","+",","answers"$"是保留的。

RFC 2616,"超文本传输协议—HTTP/1.1",§3.2.2,"HTTP URL",没有重新定义这个。

简而言之,您给出的查询字符串("logout")是完全有效的。

键生效时不需要。它也不会降低URL的有效性,URL RFC1738没有将其列为URL的必需部分。

如果你真的不需要一个值,这只是一个偏好问题。

http://example.com/?logout

一样都是有效的URL
http://example.com/?logout=yes

唯一的区别是如果你想确保"是"比特是完全设置好的,你可以检查它的值。如:

if(isset($_GET['logout']) && $_GET['logout'] == "yes") {
    // Only proceed if the value is explicitly set to yes

如果您只是想知道logout键是否在URL中的某个地方设置,那么仅列出未分配值的键就足够了。然后你可以像这样检查:

if(isset($_GET['logout'])) {
    // Continue regardless of what the value is set to (or if it's left empty)

完全没问题,不会产生任何错误。虽然,现在大多数框架都是基于MVC的,所以在URL中你需要提到一个控制器和一个动作,所以它看起来更像/users/logout(顺便说一句,StackOverflow也使用那个URL来注销用户;)。

可能导致错误的声明对我来说听起来像是你的应用程序手动访问原始$_GET,我绝对认为构建没有框架的应用程序(通常提供MVC堆栈和路由器/调度程序)是真正危险的事情。

相关文章: