【发布时间】:2012-01-13 10:13:18
【问题描述】:
如果用户尝试访问需要用户登录的页面,返回的正确 http 状态代码似乎存在很多混淆。
那么当我显示登录页面时,基本上会发送什么状态码?
我很确定我们需要使用4xx 范围内的状态码。
我在这里不是在谈论 HTTP 身份验证,所以至少有 1 个状态代码我们不会使用 (401 Unauthorized)。
现在我们应该使用什么?答案(也在 SO 上)似乎有所不同:
根据答案here,我们应该使用403 Forbidden。
但是在状态码的描述中是:
授权无济于事,不应重复请求。
嗯,这看起来不像是正确的。因为授权会有所帮助。
所以让我们看看其他答案。答案here 甚至根本不使用4xx 范围,而是使用302 Found
302 Found状态码的描述:
请求的资源暂时位于不同的 URI 下。由于重定向有时可能会改变,客户端应该继续使用 Request-URI 来处理未来的请求。此响应仅在 Cache-Control 或 Expires 标头字段指示时才可缓存。
我认为这也不是我想要的。因为它不是位于不同 URI 下的请求资源。而是完全不同的资源(登录页面与经过身份验证的内容页面)。
所以我继续前进并选择了另一个answer,令人惊讶的是另一个解决方案。
这个答案建议我们选择400 Bad Request。
这个状态码的描述是:
由于语法错误,服务器无法理解该请求。客户端不应该不加修改地重复请求。
我认为服务器可以很好地理解请求,但只是在用户通过身份验证之前拒绝授予访问权限。
另一个answer 也表示403 的响应是正确的,但它的结尾是:
如果这是一个面向公众的网站,您试图根据会话 cookie [这就是我所做的] 拒绝访问,200 带有适当的正文以指示需要登录或 302 临时重定向到登录页面通常是最好的。
所以403 是正确的,但200 或302 是最好的。
嘿!这就是我要寻找的:最好的解决方案。但是最好的不应该和正确的一样吗?为什么它会是最好的?
感谢所有在这个问题上提出这么多的人:)
我知道我不应该为此担心太多。而且我认为这个问题更具假设性(不是真的,而是因为没有更好的词而使用它)。
但是这个问题已经困扰了我一段时间了。
如果我是一名经理(只是像往常一样选择一些听起来很酷的词),我会说:但是,但是,但是,但是放松很重要。 :-)
那么:the right way™ 在上述情况下使用状态码是什么(如果有的话)?
tl;dr
当用户尝试访问需要登录的页面时,正确的 http 状态代码响应是什么?
【问题讨论】:
-
如果不是 401 则由您决定,然后是 200 或 302,我使用 200,我说检查最大的搜索提供商和社交网站的标题,看看那里返回的标题。
-
412 Precondition Failed... 前提条件是通过 WWW-Auth 以外的方式向服务进行身份验证。这里没有最好的回应。我个人使用403 Forbidden,因为这就是正在发生的事情。 “授权将无济于事,不应重复请求。”指的是“WWW-Auth”。 -
正确答案是418: I'm a teapot。
-
下面是如何正确使用 401 的方法,正如 user1093284 建议的那样:stackoverflow.com/a/19102200