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

Php 一个URL:两个不同的重定向,php,redirect,post,get,http-status-codes,Php,Redirect,Post,Get,Http Status Codes,我有一个URL,曾经处理过GET和POST请求。我希望它现在只处理POST请求,并对其他请求执行重定向。基于,我似乎应该在处理POST请求后使用,而在处理其他请求时使用 我的代码流如下所示: if ('POST' === filter_input(INPUT_SERVER, 'REQUEST_METHOD')) { // process post request // set http status code header('HTTP/1.1 303 See Other

我有一个URL,曾经处理过
GET
POST
请求。我希望它现在只处理
POST
请求,并对其他请求执行重定向。基于,我似乎应该在处理
POST
请求后使用,而在处理其他请求时使用

我的代码流如下所示:

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');
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');

这是重定向代码的正确用户吗?我想确保当发出
POST
请求时,浏览器不会缓存301。

您的重定向应该是

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

对于301代码,与303类似(因此您不需要最后一个位置标头)

在303重定向上,必须指定重定向URI:

<?php
header('HTTP/1.1 303 See Other');
header('location: http://www.example.com/some-url/');
然而,在您的情况下,307重定向应该更合适。虽然307是一个临时重定向,并且您将始终在任何未发布的请求上重定向,但您可以在将来更改此行为,因为根据RFC,“由于重定向可能会偶尔更改,因此客户端应继续在将来的请求中使用请求URI”。第二个优点是:“只有当由缓存控件或Expires头字段指示时,此响应才可缓存。”

请求的资源暂时位于不同的URI下。
由于重定向可能会偶尔更改,因此客户端应
继续为将来的请求使用请求URI。此响应
仅当缓存控件或Expires标头指示时才可缓存


见第二节。10.3.8

这似乎是对代码风格的评论,而不是对问题的回答。(还请注意,规范要求位置使用绝对URI)绝对URI的优点。不,这不是代码风格的问题。就我记忆所及,做他所做的事情总是会导致302(找到)重定向。我的方法是你需要使用的一种方法,以获得正确的重定向代码。当我用cURL测试它时,我使用并得到了
HTTP/1.1 303 See Other
响应。维基百科页面实际上给出了一个相对URL的示例,所以我不确定你为什么提到必须使用绝对URI。感谢您提及
header()
函数的附加参数。我将使用这些。似乎使用“缓存控制”和“过期”头会破坏301重定向的部分实用程序。我链接到的问题中的答案暗示了基于请求类型的浏览器缓存。另外,我的代码示例在这两种情况下都指定了一个URL,因为它不在
if/else
块的范围内。“似乎使用“缓存控制”和“过期”头会破坏301重定向的部分实用程序。”。你能提供更多的细节吗?你的意思是说,301重定向应该由客户端缓存,以增强用户体验。这在我链接到的SO问题中讨论过@桑尼说得通。请参阅我的更新答案(在末尾)和备选答案。
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');