有一个与之相关的普遍误解(和误用)403 Forbidden
:不应泄露服务器对请求的看法。它是专门为说,
我能满足您的要求,但是无论您尝试什么,我都不会处理。因此,请停止尝试。
任何UA或客户应将其解释为意味着该请求将永远无法工作,并做出适当的响应。
这对客户端代表用户处理请求的含义是:如果用户未登录或输入错误,则处理请求的客户端应在第一时间后回复“对不起,但我无能为力”它获取403
并停止处理将来的请求。显然,如果您希望用户在失败后仍然能够请求访问其个人信息,则这是对用户不利的行为。
403
是相反的401 Authorization Required
,这不放弃服务器处理请求,只要你通过正确的凭据。这通常是人们听到声音时会想到的403
。
404 Page Not Found
正如其他人所指出的,它也与之相反,该设计不仅被设计为说“我找不到该页面”,而且还向客户端建议服务器不为将来的请求声明成功或失败。
使用401
和404
,服务器不会对客户端或UA透露任何处理方式:他们可以继续尝试,以期获得不同的响应。
因此404
,处理不希望显示给所有人的页面的合适方法是,您不想放弃任何在某些情况下为什么不显示页面的信息。
当然,这假设发出请求的客户端关心小巧的RFC冗余。足够恶意的客户端将不会关心返回的状态码,除非是偶然的方式。通过将其与其他已知用户页面进行比较,就会知道它是一个隐藏用户页面(或潜在的隐藏用户页面)。
也就是说,假设您的处理程序是users/*
。如果我知道users/foo
,users/bar
和users/baaz
工作中,服务器返回401
,403
或404
为users/quux
不意味着我不打算尝试一下,尤其是如果我有理由相信是一个quux
用户。一个标准的示例场景是Facebook:我的个人资料是私人的,但我对公开个人资料的评论不是。即使您返回404
我的个人资料页面,恶意客户端也会知道我的存在。
因此,状态码不是针对恶意用例的,而是针对遵循规则的客户端的。对于那些客户,一个401
或一个404
请求是最合适的。