如果已经发送标题,如何使用PHP重定向?

时间:2012-06-14 14:30:23

标签: php http redirect

在PHP中重定向到不同页面的规范方式(据我所知)是这样的:

header("Location: URL");
exit();

但是我想我需要在部分页面渲染后重定向。我习惯使用ASP.NET,我可以在任何我想要的地方执行此操作

Response.Redirect("URL");

但是我无法想象如何在PHP中做同样的事情。可能吗?如果是这样,如何,如果不是,为什么不呢?

6 个答案:

答案 0 :(得分:1)

理想情况下,您应该重新安排代码,以便重定向只能在发送任何标头之前发生。但如果你不能,你可以将所有东西都存储在一个缓冲区中,并在完成所有工作后发送到浏览器:

ob_end_clean();
header('Location: xx');

您可能需要在脚本的顶部放置ob_start();

我不同意JS解决方案,但在这个时代,我希望它会没问题。

答案 1 :(得分:1)

我建议将url存储在变量中,并在最后重定向。在此过程中,您不应发送任何内容,而是将其存储并在结尾处发送,以确保您不会收到“标头已发送”错误。

$url = '/posts';

// code code code
// oops, we want to redirect elsewhere now
$url = '/tags';

// end of script, send *content* and headers
header("Location: $url");

显然这里有很大的改进空间,但你明白了。在请求完成之前,请勿发送标题或内容。

答案 2 :(得分:1)

使用标头功能是不可能的,因为它的目的是发送标头(不仅仅是重定向用户),而且在输出启动时你不能这样做,因为为时已晚

一个快速解决方法是使用javascript,但这不是一个“优雅”的解决方案,更不用说如果访问者禁用javascript或javascript代码中的某些错误导致问题它不起作用。

我认为确保您可以在任何时候重定向的最佳方法是确保在脚本完成之前不呈现任何输出。要做到这一点,你应该至少使用一个模板引擎,以确保你的PHP代码与html分开,并且内容最后发送给用户。

你也可以使用输出缓冲,因为这样你可以延迟输出被引导的时刻(当超出输出缓冲区大小或你自己冲洗它时;请参阅php.net/ob_start这样;你需要做与此类似的东西:http://codepad.org/AomD4Sok

PS:在重定向后不要忘记死/退出,不管你怎么做

答案 3 :(得分:1)

或者,您可以使用html重定向来重定向页面。

<meta http-equiv="refresh" content="0; url=xxx.php?page=2">

但是,在重定向页面之前,页面在此行等待大约1秒钟。

(对不起朋友。我的英语不流利:(()

我希望这些信息对您的业务有利。

答案 4 :(得分:0)

在页面开头添加: ob_start(); 在配置文件中开始缓冲或启用缓冲。然后,您输出的所有内容都将“等待”脚本完成或者您要刷新缓冲区:ob_flush。

所以:

ob_start();
//something
ob_end_clean(); //erase output
header('Location: ');

答案 5 :(得分:0)

您可以使用与您习惯的语义类似的语义实现自己的Response类,并使用它的实例来累积要作为响应发送的输出,而不是依赖于PHP的默认行为任何你想要的地方。这样,您可以控制何时发送响应(以及标题)。这就是许多PHP框架实际上做的事情 - 您可能希望环顾四周,看看是否可以选择一个适合您的框架,而不是使用原始PHP。