一个URL:两个不同的重定向

时间:2014-06-11 16:05:08

标签: php redirect post get http-status-codes

我有一个曾经处理过GETPOST个请求的网址。我希望它现在只处理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进行缓存。

2 个答案:

答案 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