我有一个曾经处理过GET
和POST
个请求的网址。我希望它现在只处理POST
个请求,并为其他请求重定向。基于on this question,似乎我应该在处理POST
请求后使用303
,并为其他请求使用301
。
我的代码流程如下所示:
if ('POST' === filter_input(INPUT_SERVER, 'REQUEST_METHOD')) {
// process post request
// set http status code
header('HTTP/1.1 303 See Other');
} else {
// set http status code
header('HTTP/1.1 301 Moved Permanently');
}
header('Location: /newurl.php');
这是重定向代码的正确用户吗?我想确保在发出POST
请求时,浏览器不会对301进行缓存。
答案 0 :(得分:1)
您的重定向应该是
header('Location: http://www.example.com/newurl.php',true,301);
表示301代码,与303类似(因此您不需要最后一个Location标头)。 See the manual on header
答案 1 :(得分:1)
在303重定向上,您必须指定重定向URI:
<?php
header('HTTP/1.1 303 See Other');
header('location: http://www.example.com/some-url/');
作为缓存301响应的变通方法,您可以设置过去的过期日期。这样,我们鼓励客户将响应标记为立即过期:
<?php
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: Sat, 1 Feb 1997 06:00:00 GMT');
任何尊重RFC 2616的客户都不应缓存303响应:
303响应绝不能被缓存,而是对第二个响应 (重定向)请求可能是可缓存的。
考虑到上述情况,您可以将初始代码段更改为以下内容:
if ('POST' === filter_input(INPUT_SERVER, 'REQUEST_METHOD')) {
// process post request
// set http status code
header('HTTP/1.1 303 See Other');
header('Location: http://www.example.com/newurl.php'); // FULL URI HERE
exit;
}
// set http status code
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com/other-page.php');
但是,在您的情况下,307重定向应该更合适。虽然307是临时重定向,并且您将始终重定向任何非POST的请求,但您可以在将来更改此行为,因为根据RFC“由于重定向有时可能会被更改,因此客户端应该继续使用未来请求的请求URI “。第二个优点是:“如果由Cache-Control或Expires标头字段指示,则此响应仅可缓存。”
请求的资源暂时驻留在不同的URI下 由于重定向有时可能会改变,客户端应该是 继续使用Request-URI用于将来的请求。这个回应
如果由Cache-Control或Expires标头指示,则只能缓存 字段。
见RFC 2616秒。 10.3.8