21

我和我的老板就使用没有价值的 GET 参数的 URL 发生了一点争论。例如

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

我在网上经常看到这种链接,但当然,这并不意味着它是一件好事。他担心这不标准并且可能导致意外错误,所以他宁愿我使用类似的东西:

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

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

但是我无法确认这种用法实际上是有效的,因此真的不会导致任何问题。

你有关于这个的任何链接吗?

4

3 回答 3

21

RFC 2396,“Uniform Resource Identifiers (URI): Generic Syntax”,§3.4,“Query Component”是有关查询字符串的权威信息来源,并指出:

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

[...]

在查询组件中,保留字符“;”、“/”、“?”、“:”、“@”、“&”、“=”、“+”、“”和“$”。

RFC 2616,“超文本传输​​协议——HTTP/1.1”,§3.2.2,“http URL”,没有重新定义这一点。

简而言之,您提供的查询字符串(“注销”)是完全有效的。

于 2013-01-07T10:37:22.757 回答
7

键不需要任何值才能产生任何效果。它也不会降低 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)
于 2013-01-07T10:39:10.240 回答
3

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

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

于 2013-01-07T10:37:08.533 回答