2012-06-14 24 views
2

的正规途径(据我可以告诉)重定向到PHP中的不同页面是这样的:如果头部已经发送,我该如何使用PHP重定向?

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

但是让我们假设我需要的页面的一部分已经被渲染后重定向。我已经习惯了使用ASP.NET在那里我可以做到这一点的任何地方,我想

Response.Redirect("URL"); 

,但我想不出如何做等值的PHP。可能吗?如果是这样,如何,如果不是,为什么不呢?

+3

你应该改变你的逻辑:没有必要将数据输出0.1秒前您将用户发送到其他地方 – Sherlock

回答

1

这是不可能通过使用头功能为宗旨,送头(不仅将用户重定向),当输出开始,你不能这样做,因为它是为时已晚

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

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

您也可以使用输出缓冲,因为这样可以延迟输出启动时的时刻(当输出缓冲区大小超出或您自己刷新时;请参见php.net/ob_start;您需要做类似于这样的:http://codepad.org/AomD4Sok

PS:不要忘了重定向后,模/退出时,没有母校你将如何做到这一点

0

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

所以:

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

理想情况下,你应该重新安排你的代码,使任何头被发送之前重定向只能发生。但是,如果你不能,你可以存储所有的缓冲区和发送到浏览器,一旦一切都已经完成:

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

您可能需要在你的脚本的顶部有ob_start();虽然。

我打算不同意JS解决方案,但在这个时代,我希望它会没事的。

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

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

+0

您无法在内容(1)之后发送标题字段。此外,要让位置有任何效果,您需要发送3xx状态码,这意味着在开始发送之前您需要知道反应 (1)除了使用“拖车”,这是普通的UA不支持。 –

+0

我不知道我理解你,我只是在这里说,脚本完成时应发送响应(标题和全部)。这应该被包装在一个类中,并在一种调度过程中进行处理,但是帖子的要点是“当你准备好脚本时存储你想发送和发送的内容,包括正确呈现内容。” – jeremyharris

0

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

1

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

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

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

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

我希望这个信息的好处到你的业务

相关问题