用于重定向页面的PHP标头

时间:2010-04-09 05:40:57

标签: php http http-redirect

我想通过在标题中使用标记来重定向页面,但它不起作用。

4 个答案:

答案 0 :(得分:4)

在页面顶部添加以下内容(在任何html或php之前):

<?php
header('Location: http://stackoverflow.com/users/300204/zaf');
exit();
?>

如果重定向你(到一个很棒的程序员的主页),那么你需要在使用这个header()函数之前检查你没有输出任何内容。在将任何内容发送给用户之前,需要调用header()函数。

答案 1 :(得分:2)

最常见的原因是“已发送标头”错误。因此,您有两个问题需要解决。

  1. 由于您的问题中没有错误消息文本,我可以假设您没有此文本。但是程序员必须看到发生的每条错误消息。您必须在开发人员的环境中设置display_errors设置on或查看生产中的日志。此外,error_reporting()级别必须设置为E_ALL。

  2. 应用程序设计。您的应用程序必须分为两部分:业务逻辑和表示逻辑。第一个从用户,数据库等获取数据。后者显示收集的数据。在表示逻辑部分运行之前,不必将单个字节发送到浏览器。在这种情况下,你永远不会有这样的错误。

  3. 一个例外是BOM - 字节顺序标记,一个符号,由一些编辑器静默放入您的文件中。只需使用“无需BOM即可保存”功能。

答案 2 :(得分:0)

你需要:

header('Location: http://google.com');

它可能不起作用,因为你在标题之前有一些php输出,确保没有空格或任何字符,或者在标题功能之前输出ECHO。通常它会给出一个错误,你可以找到你有这个额外空间的地方,比如“已经在index.php第1行的页面发送了标题”

答案 3 :(得分:0)

正如一些人所指出的,你必须在内容之前输出标题。执行此操作的理想方法是将业务逻辑和表示逻辑分成不同的部分,但有时您会遇到不执行此操作的遗留代码。

在这种情况下,PHP的output control函数可能很有用;使用ob_start()和ob_end_flush()来捕获输出,然后在最后刷新它。这允许您的代码在任何地方或多或少使用header(),例如

<?php

function doSomeStuff() {
  echo 'look, outputting stuff here';
  header('Location: /');
}

doSomeStuff();
?>

以上代码将为您提供有关已发送标头的错误,但以下代码将起作用。

<?php
function doSomeStuff() {
  echo 'look, outputting stuff here';
  header('Location: /');
}

ob_start();
doSomeStuff();
ob_end_flush();
?>

在这种情况下,echo()的输出直到ob_end_flush()才会发送,因此header()调用可以正常工作。此方法可用于包装未正确分离业务和表示逻辑的遗留代码。