【问题标题】:One URL: Two Different Redirects一个 URL:两种不同的重定向
【发布时间】:2014-06-11 16:05:08
【问题描述】:

我有一个曾经处理过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。

【问题讨论】:

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


    【解决方案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');
    

    303 响应不应被任何尊重RFC 2616 的客户端缓存:

    303 响应不能被缓存,但对第二个响应的响应 (重定向的)请求可能是可缓存的。

    考虑到上述情况,您可以将初始代码 sn-p 更改为如下内容:

    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

    【讨论】:

    • 似乎使用 'Cache-Control' 和 'Expires' 标头会破坏 301 重定向的部分实用程序。我链接的问题中的答案暗示了基于请求类型的浏览器缓存。此外,我的代码示例在这两种情况下都指定了一个 URL,因为它位于 if/else 块之外。
    • " 似乎使用 'Cache-Control' 和 'Expires' 标头会破坏 301 重定向的部分实用程序。 "。您能否详细说明您的意思是该声明?
    • 301 重定向应该由客户端缓存以增强用户体验。它在我链接到的 SO 问题中进行了讨论。 stackoverflow.com/questions/4764297/…
    • @Sonny 有道理。请参阅我的更新答案(在末尾​​i>)以及替代方案。
    【解决方案2】:

    你的重定向应该是

    header('Location: http://www.example.com/newurl.php',true,301);
    

    对于 301 代码,与 303 类似(因此您不需要最后一个 Location 标头)。 See the manual on header.

    【讨论】:

    • 这似乎是对代码风格的评论,而不是对问题的回答。 (另请注意,规范要求位置的绝对 URI)
    • 关于绝对 URI 的要点。不,这不是代码风格的问题。据我所知,做他所做的总是会导致 302(找到)重定向​​。我的方法是您需要使用的方法才能获得正确的重定向代码。
    • 我使用了 this code 并在使用 cURL 进行测试时得到了 HTTP/1.1 303 See Other 响应。
    • 维基百科页面实际上给出了一个相对 URL 的例子,所以我不确定你为什么提到必须使用绝对 URI。 en.wikipedia.org/wiki/HTTP_location#Relative_URL_example
    • 感谢您提及 header() 函数的附加参数。我将使用这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多