在 PHP 中重定向到不同页面的规范方式(据我所知)是这样的:
header("Location: URL");
exit();
但是让我们假设我需要在部分页面呈现后重定向。我习惯于使用 ASP.NET,我可以在任何我想要的地方执行此操作
Response.Redirect("URL");
但我不知道如何在 PHP 中做一些等效的事情。是否可以?如果是,如何,如果不是,为什么不呢?
使用标头函数是不可能的,因为它的目的是发送标头(不仅是为了重定向用户),而且当输出开始时你不能这样做,因为太晚了
一个快速的解决方法是为此使用 javascript,但这不是一个“优雅”的解决方案,更不用说如果访问者禁用了 javascript 或 javascript 代码中的某些错误导致问题,它就不起作用。
我认为确保您可以随时重定向的最佳方法是确保在脚本完成之前不呈现任何输出。为此,您应该至少使用一个模板引擎来确保您将 php 代码与 html 分开,并且在最后将内容发送给用户。
You could also use output buffering, because this way you can delay the moment when output is sterted (when the output buffer size is exceeded or you flush it yourself; see php.net/ob_start for this; you would need to do something similar to this:http://codepad.org/AomD4Sok )
PS: don't forget about die/exit after the redirect, no mater how you will do it
or, you can use html redirect for redirecting page.
<meta http-equiv="refresh" content="0; url=xxx.php?page=2">
But, page is waiting aproximately 1 second on this line before redirecting page.
(I am sorry friends. My english is not fluency :(( )
I hope this information benefits to your business.
理想情况下,您应该重新安排您的代码,以便重定向只能在发送任何标头之前发生。但如果你不能,你可以将所有内容存储在缓冲区中,并在所有内容完成后发送到浏览器:
ob_end_clean();
header('Location: xx');
不过,您可能需要ob_start();
在脚本的顶部放置。
我本来不同意 JS 解决方案,但在这个时代,我希望它会很好。
我建议将 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");
显然这里有很大的改进空间,但你明白了。在您的请求完成之前,请勿发送标头或内容。
在页面开头添加:ob_start(); 开始缓冲或在配置文件中启用缓冲。然后,您输出的所有内容都将“等待”脚本完成或刷新缓冲区:ob_flush。
所以:
ob_start();
//something
ob_end_clean(); //erase output
header('Location: ');
您可以使用类似于您习惯的语义来实现您自己的Response
类,并使用它的一个实例来累积要作为响应发送的输出,而不是依赖 PHP 的默认行为,即在您希望的任何地方打印任何内容。通过这种方式,您可以控制何时发送响应(以及标头)。这就是许多 PHP 框架实际上所做的事情——您可能想环顾四周,看看是否可以选择一个适合您的框架,而不是使用原始 PHP。