Rud*_*die 35 http-redirect http-headers http-status-code-401
我想401 Unauthorized在某个地方发送AND重定向客户端.然而:
如果我这样做:
header('HTTP/1.1 401 Unauthorized');
header('Location: /');
Run Code Online (Sandbox Code Playgroud)
服务器会发送一个302 Found带有Location,所以不是401 Unauthorized.
如果我这样做:
header('Location: /');
header('HTTP/1.1 401 Unauthorized');
Run Code Online (Sandbox Code Playgroud)
浏览器接收a 401 Unauthorized和a Location,但不重定向.
(IE 9和Chrome 16的行为相同,所以我猜它是正确的)
也许我在滥用HTTP?我希望我的应用程序界面对所有客户端完全相同:文本浏览器,现代浏览器,API调用等.401 +响应文本将告诉API用户什么是什么.重定向对浏览器很有用.
有(好的)方式吗?
tyt*_*ytk 12
我来这里很晚,但我想我会加两分钱.据我了解,希望表明用户没有正确的授权并提示他们登录.Rudie可以理解地希望返回401 Unauthorized(因为用户需要通过某种机制进行授权,例如记录in),并将它们转发到登录页面 - 但这不是很容易实现,并且大多数库都不支持开箱即用.一种解决方案是在401响应的正文中显示登录页面,如另一个答案中所建议的那样.但是,让我从已建立/最佳实践的角度来看一看.
测试案例1:Facebook
在注销时导航到受保护的Facebook页面(我的用户配置文件)会导致404 Not Found响应.Facebook提供了一个通用的"此页面不可用"页面,其中还包含一个登录表单.有趣.更有趣的是:当我导航到"事件"页面时,我收到了302响应,它转发到登录页面(返回200响应).所以我猜他们的想法是为我们知道存在的页面返回302 ,但是为可能存在或可能不存在的页面提供404(例如,以保护用户的隐私).
测试案例2:谷歌收件箱
当我退出时导航到我的收件箱返回302并转发到登录页面,类似于Facebook.我无法弄清楚如何将我的Google+个人资料设为私有,因此没有测试数据......
测试案例3:Amazon.com
当我退出时导航到我的订单历史记录返回302并像以前一样将我转发到登录页面.亚马逊没有"个人资料"页面的概念,因此我无法在此测试.
为了总结这里的测试用例,如果用户需要登录,似乎最好将302 Found和forward转发到登录页面(尽管我认为303 See Other实际上更合适).这当然只是在真正的人类用户需要以html形式输入用户名和密码的情况下.对于其他类型的身份验证(例如,基本,api密钥等),401 Unauthorized显然是适当的响应.在这种情况下,无需转发到登录页面.