我在我正在建设的网站上有一份注册表。如果填写正确,我希望用户返回主页面。
我尝试使用header
,但我得到“无法修改标题信息......”我想这是因为我发布到$_SERVER['PHP_SELF']
;
如果表单正常,如何重定向用户的任何建议? (除了带按钮的成功页面)
答案 0 :(得分:8)
如果Web服务器没有向用户浏览器输出其他文本/字符串数据,则只能使用header()
函数。
您需要先将重定向的逻辑放在脚本顶部,然后再进行其他操作:
<?php
// Process form
// If processing was successful, redirect
if($success)
{
header("Location: http://www.main-page-url.com/");
}
?>
这样做的原因是,当浏览器从Web服务器接收信息时,它会收到HTTP标头(header()
函数将重定向输出到),然后在HTTP之后输出HTTP响应的主体头。如果您的脚本在header命令之前echo
任何内容,您将继续收到该错误。
答案 1 :(得分:1)
您无法修改标头信息消息,因为您尝试在将内容呈现到页面后将新标头发送到浏览器。如果在任何echo / print调用之前执行header()调用,它将重定向。否则,您需要元重定向。你发布表格的地方是无关紧要的。
答案 2 :(得分:1)
这不起作用的原因是标头位于HTTP请求中的内容之前。当您输出内容时,PHP会先发送所有标题及其处理过的所有内容,从而领先于游戏。发送HTTP请求没有CTRL + Z,因此header()
函数在发送后无法添加标题。
但是,如果您使用ob缓冲函数系列,则可以在回显内容后调用header()
。调用ob_start()
缓冲页面输出,进行任何必要的标题调用或内容输出,最后使用ob_end_flush()
发送输出。实施例
<?php
ob_start(); //Start buffering
?>
<p>This is output!!!</p>
<?php
header('403 Moved Permanently'); //Fancy redirect is fancy
ob_end_flush(); //Send page content with redirect header
?>
使用缓冲的唯一可能的缺点是,在调用ob_end_flush()
命令之前,用户在接收内容时会遇到轻微的挂起。但是,这很可能不会引起注意,所以你不应该担心它!
在完成所有这些操作之前,您可以考虑在代码中输出内容之前将所有标题调用移动到某个位置。还要检查前面空格的开始PHP标记,因为它们会强制发送标题和内容。