如果用户尝试访问需要用户登录的页面,则返回的正确 http 状态代码似乎存在很多混乱。
那么当我显示登录页面时基本上会发送什么状态代码?
我很确定我们需要在4xx
range.
我在这里讨论的不是 HTTP 身份验证,因此我们至少不会使用 1 个状态代码(401 Unauthorized
).
现在我们应该使用什么?答案(也在此处)似乎有所不同:
根据答案here https://stackoverflow.com/questions/4301877/http-status-code-for-missing-authentication#answer-4301901我们应该使用403 Forbidden
.
但在状态码的描述中是:
授权不会有帮助,并且不应重复请求。
嗯,这看起来不太合适。因为授权会有帮助。
那么让我们看看其他一些答案。答案here https://stackoverflow.com/questions/2839585/what-is-correct-http-status-code-when-redirecting-to-a-login-page#answer-2839594甚至不使用4xx
根本没有范围,而是使用302 Found
的描述302 Found
状态码:
请求的资源暂时驻留在不同的 URI 下。由于重定向有时可能会改变,因此客户端应该继续使用 Request-URI 来处理将来的请求。仅当由 Cache-Control 或 Expires 标头字段指示时,此响应才可缓存。
我想这也不是我想要的。因为它不是驻留在不同 URI 下的请求资源。而是完全不同的资源(登录页面与经过身份验证的内容页面)。
所以我继续前进并选择了另一个answer https://stackoverflow.com/questions/6110672/correct-http-status-code-for-login-form#answer-6110891令人惊讶的是还有另一种解决方案。
这个答案建议我们选择400 Bad Request
.
该状态码的描述为:
由于语法错误,服务器无法理解该请求。客户端不应在未经修改的情况下重复请求。
我认为服务器很好地理解了该请求,但只是拒绝在用户经过身份验证之前提供访问权限。
Another answer https://stackoverflow.com/questions/4301877/http-status-code-for-missing-authentication#answer-4301905还说一个403
响应是正确的,但它的结尾是:
如果这是一个面向公众的网站,您试图根据会话 cookie 拒绝访问 [这就是我所做的],则通常会使用 200 和适当的正文来指示需要登录,或者通常会使用 302 临时重定向到登录页面最好的。
So 403
是正确的,但是200
or 302
是最好的。
嘿!这就是我正在寻找的:最好的解决方案。但最好的不应该和正确的一样吗?为什么它会是最好的?
感谢所有回答这个问题的人:)
我知道我不应该对此太担心。我认为这个问题更具假设性(不是真的,但因为缺乏更好的词而使用它)。
但这个问题已经困扰我一段时间了。
如果我是一名经理(他们只是像往常一样拿起一些听起来很酷的词)我会说:但是,但是,但是,但是休息很重要。 :-)
那么:什么是the right way™
在上述情况下使用状态代码(如果有)?
tl;dr
当用户尝试访问需要登录的页面时,正确的 http 状态代码响应是什么?