当用户没有登录而试图访问需要登录的页面时,重定向到登录页面的正确 HTTP状态码是什么?
我这样问是因为 由 W3C 设置的3xx 响应代码 看起来都不符合要求:
10.3.1300选择题
请求的资源对应于 一系列表述中的任何一种, 每个都有自己特定的位置, 以及代理人主导的谈判 (第12条) 提供,以便用户(或用户) 代理)可以选择首选的 表示和重定向其 请求到该位置。
除非是校长的要求 回应应该包括一个实体 包含资源列表的 的特征及位置 用户或用户代理可以 选择一个最合适的 实体格式由 内容类型中给定的媒体类型 头字段。取决于 格式和能力
用户代理,选择最多 可以进行适当的选择 自动。但是,这个 规范没有定义任何 这种自动选择的标准。
如果服务器有首选项,则为 代表性,应该包括 特定的 URI 在位置字段中的表示; 用户代理可以使用 Location 字段 自动重定向的值 除非指示,否则响应是可缓存的 否则。
10.3.2301永久性迁移
请求的资源已被 分配一个新的永久 URI 和任何 未来对此资源的引用 应该使用返回的 URI 之一。 具有链接编辑能力的客户端 应该自动重新连接 对请求 URI 的引用 或返回的更多新引用 服务器,如果可能的话。这 除非指示,否则响应是可缓存的 否则。
应给予新的永久 URI 通过响应中的 Location 字段。 除非请求方法是 HEAD, 回应的实体应该 包含一个简短的超文本说明 新 URI 的超连结。
中接收到301状态码 对 GET 以外的请求的响应 或者 HEAD,用户代理不能 自动重定向请求 除非能得到环境保护署的确认 用户,因为这可能会更改 请求的条件 已发出。
Note: When automatically redirecting a POST request after receiving a 301 status code, some existing HTTP/1.0 user agents will erroneously change it into a GET request.10.3.3发现302
请求的资源驻留在 暂时使用不同的 URI。 因为重定向可能会改变 有时候,客户应该 继续使用 Request-URI 未来的要求。这个回应只是 如果由 缓存-控制或过期头字段。
临时 URI 应由 响应中的 Location 字段。 除非请求方法是 HEAD, 回应的实体应该 包含一个简短的超文本说明 新 URI 的超连结。
中接收到302状态码 对 GET 以外的请求的响应 或者 HEAD,用户代理不能 自动重定向请求 除非能得到环境保护署的确认 用户,因为这可能会更改 请求的条件 已发出。
Note: RFC 1945 and RFC 2068 specify that the client is not allowed to change the method on the redirected request. However, most existing user agent implementations treat 302 as if it是303 则对 Location 字段-value 执行 GET 状态代码303和307具有 被添加的服务器,希望明确说明哪些 客户应该有这样的反应。
10.3.4303见其他
对请求的响应可以是 在不同的 URI 下找到 上使用 GET 方法检索 这个方法存在 主要是为了允许输出 POST 激活的脚本重定向 所选资源的用户代理 New URI 不是替代引用 获取最初请求的资源。 不能缓存303响应, 而是对第二个的反应 (重定向)请求可能是 可缓存的。
不同的 URI 应该由 响应中的 Location 字段。 除非请求方法是 HEAD, 回应的实体应该 包含一个简短的超文本说明 新 URI 的超连结。
Note: Many pre-HTTP/1.1 user agents do not understand the 303 status. When interoperability with such clients is a concern, the 302 status code may be used instead, since most user agents react to a 302 response as described here for 303.10.3.5304未经修改
如果客户端已执行 条件 GET 请求和访问是 但该文件并没有 修改,服务器应该响应 用这个状态码304 答复必须不包含 消息体,因此总是 以第一个空行结束 在标题字段之后。
响应必须包括 以下标题字段:
- Date, unless its omission is required by section 14.18.1 If a无时钟原始服务器服从这些 规则,代理和客户端添加 对任何回应的日期 收到没有一个(因为已经 [ RFC 2068] ,第 14.19) ,缓存将正常运行。
- ETag and/or Content-Location, if the header would have been sent in a 200 response to the same request - Expires, Cache-Control, and/or Vary, if the field-value might differ from that sent in any previous response for the same variant If the conditional GET used a strong cache validator (see第13.3.3节) ,回应应 不包括其他实体头。 否则(即,条件 GET 使用弱验证程序) ,响应 不能包括其他实体头; 这可以防止 缓存的实体-主体和更新 标题。
如果304响应表示一个实体 当前没有缓存,那么缓存 必须无视反应和重复 无条件的要求。
如果缓存使用接收到的304 响应以更新缓存条目,则 缓存必须更新条目以反映 中给出的任何新字段值 回应。
10.3.6305使用代理服务器
请求的资源必须是 通过给定的代理访问 位置字段。位置字段 给出代理的 URI 预计收件人将重复这一点 通过代理发出的单个请求 回应必须只能由 原始服务器。
Note: RFC 2068 was not clear that 305 was intended to redirect a single request, and to be generated by origin servers only. Not observing these limitations has significant security consequences.10.3.7306(未使用)
中使用了306状态代码 以前版本的规范, 不再使用,而代码是 保留意见。
10.3.8307临时转接
请求的资源驻留在 暂时使用不同的 URI。 因为重定向可能被改变 有时候,客户应该 继续使用 Request-URI 未来的要求。这个回应只是 如果由 缓存-控制或过期头字段。
临时 URI 应由 响应中的 Location 字段。 除非请求方法是 HEAD, 回应的实体应该 包含一个简短的超文本说明 超连结至新的 URI,因为 许多 HTTP/1.1之前的用户代理都没有 了解307的情况。因此, 注释应该包含 必要的信息 重复新的原始请求 URI.
中接收到307状态码 对 GET 以外的请求的响应 或者 HEAD,用户代理不能 自动重定向请求 除非能得到环境保护署的确认 用户,因为这可能会更改 请求的条件 已发出。
我现在使用302,直到我找到 的的正确答案。
最新消息及结论:
HTTP 302更好,因为它与客户端/浏览器具有最好的兼容性。