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

s42*_*427 17 php url get

我和我的老板谈论使用GET参数而没有值的URL.例如

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

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

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

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

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

你有这方面的链接吗?

Ign*_*ams 17

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

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

[...]

在查询组件中,保留字符";","/","?",":","@","&","=","+",","和"$".

RFC 2616,"超文本传输​​协议 - HTTP/1.1",§3.2.2,"http URL",不重新定义.

简而言之,您提供的查询字符串("注销")完全有效.

  • 感谢您的精确参考.:-)如果有人感兴趣,这是直接链接:https://tools.ietf.org/html/rfc2396#page-15.也相关:https://tools.ietf.org/html/rfc1738#page-9(在另一个答案中提到). (2认同)

Old*_*ool 7

密钥不需要值就可以产生任何影响.它也不会使URL的有效性降低,URL RFC1738不会将其列为URL的必需部分.

如果你真的不需要价值,那只是一个偏好问题.

http://example.com/?logout
Run Code Online (Sandbox Code Playgroud)

就像有效的URL一样

http://example.com/?logout=yes
Run Code Online (Sandbox Code Playgroud)

它的所有不同之处在于,如果你想确保"是"位是绝对设置的,你可以检查它的值.喜欢:

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

如果您只想知道logout密钥是否设置在URL中的某个位置,那么仅列出没有赋值的密钥就足够了.然后你可以这样检查:

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