现在我们已经有了显示UI元素的网页,以及只处理表单提交的网页,然后重定向回UI页面.他们使用PHP的header()函数执行此操作:
header("Location: /other_page.php");
这会导致发送302 Found响应; 根据HTTP 1.1规范,302适用于"请求的资源暂时驻留在不同的URI下"的情况.[HTTP 1.1规范]
从功能上来说,这很好,但看起来这似乎是我们正在做的正确的状态代码.看起来303("See Other")在这里是合适的状态,所以我想知道是否有任何理由不使用它.我们必须更明确地使用header(),因为我们必须指定状态行而不仅仅是Location:字段.思考?
您可以使用其中任何一种,但用于重定向后的正确状态代码为303.
混乱有一个历史性的解释.最初,302指定浏览器不得更改重定向请求的方法.这使得它不适合重定向后发布,您希望浏览器发出GET请求.但是,所有浏览器似乎都误解了规范并始终发出GET请求.为了消除歧义,HTTP/1.1指定了两个新代码:303和307.303基本上指定302的事实解释,而307指定302的原始规范.因此在实践中302和303是可互换的,并且在理论302和307是.
如果你真的关心兼容性,那么302比303更安全,因为HTTP/1.0代理可能不理解303,但所有现代浏览器都说HTTP/1.1,所以这不是一个真正的问题.我建议使用303,因为这是最正确的事情.
在旁注; 该Location
字段应为完整的URL.在实践中它并不重要 - 浏览器是宽容的 - 但如果你关心规范,这是正确的事情.