【问题标题】:How can I redirect in PHP without header errors?如何在没有标头错误的情况下在 PHP 中重定向?
【发布时间】:2010-11-18 08:05:50
【问题描述】:

如何使用下面的设置在 PHP 中重定向而不会出现标头输出错误,我知道在设置标头之前无法将任何内容打印到浏览器,我正在寻找解决方案,而不是解释为什么会发生这种情况.

<?PHP
// include header
include ('header.inc.php');



// In my body section file if this is a page that requires a user be logged in then
// I run a function validlogin($url-of-page-we-are-on); inside of that file
//the function is below, it outputs a redirect to login page if not logged in

// include body of page we want
include ('SOME-FILE-HERE.php');



// include footer
include ('footer.inc.php');



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis
function validlogin($url) {
    if ($_SESSION['auto_id'] == '') {
        $msg = 'Please login';
        $_SESSION['sess_login_msg'] = $msg;
        $_SESSION['backurl'] = $url;
        $temp = '';
        header("Location: /");
        exit();
    }
}
?>

我想使用 php 的 header 函数,而不是 meta 或 javascript 重定向

如果可能的话,维护一个需要登录或不需要登录的页面列表不是一个选项

【问题讨论】:

    标签: php redirect header


    【解决方案1】:

    使用{ echo '&lt;META HTTP-EQUIV="Refresh" Content="0; URL=process.php"&gt;';}

    【讨论】:

      【解决方案2】:

      你不能这样做吗:

      <?php
      validlogin($url); // call the function here
      include ('header.inc.php');
      include ('SOME-FILE-HERE.php');
      include ('footer.inc.php');
      ?>
      

      或者,如果可能的话,将包含文件放入每个“SOME-FILE-HERE”类型的文件中,这样您最终会得到:

      <?php
      validlogin($url); // call the function here
      include ('header.inc.php');
      ?>
      
      <h1>Page heading</h1>
      ...page content etc...
      
      <?php
      include ('footer.inc.php');
      ?>
      

      【讨论】:

      • sorry II 对同样的问题有另一个问题,我没有意识到我在这个问题上,无论如何这就是我最终做的方式,而且效果很好
      【解决方案3】:

      正如其他人已经提到的那样,使用ob_start()output_buffer-设置来缓冲输出。除此之外,在我看来,在功能代码中间输出内容不是一个好习惯,但这是另一个话题。

      您可以在 Google 或this Article about Output Buffering in PHP 中找到更多信息。

      【讨论】:

        【解决方案4】:

        您需要缓冲输出,以便 HTTP 标头不会在第一个输出上发送。您可以通过启用ouput_buffering 或通过调用ob_start 显式缓冲任何输出。但后者必须在第一个输出之前调用,因此最好在最初调用的脚本的第一行中调用。

        【讨论】:

          【解决方案5】:

          footer.inc.php 和 SOME-FILE-HERE.php 是否立即写入响应流?因为如果是这样,这将不起作用,因为您在发送标头之前已经写了一些东西。

          【讨论】:

          • 没错,现在你明白这个问题了=)
          • 啊,好吧,这变得更具挑战性 :) 有一个函数,我一辈子都记不起来了,它强制处理器缓存响应,直到你发出命令发送这一切,我会尽力为您查找,因为这可能会解决您的问题...
          • jasondavis,Gumbo 的答案是正确的,但请确保在脚本末尾调用 ob_end_flush() 以发送缓冲的响应流。基本上, ob_start(); //你的所有代码,包括任何包含 ob_end_fush();
          【解决方案6】:

          只要在 header() 函数之前没有脚本输出就可以了。检查没有回声或空白。将 ob_start() 放在开头也会有所帮助。有时会有不可见的空白 - 将文档格式更改为 ANSI 或 Unicode 可能会有所帮助!

          作为注释(尽管我认为您已经知道)标头不会终止脚本,因此 exit()(您拥有)是一个明确的要求。

          【讨论】:

          • 有输出,在我的示例中,在我知道我是否在需要登录的页面上之前,我的整个头文件都已输出!
          • 那么validlogin()函数应该在header被包含之前被调用吗?
          • 不可能,因为我也提到过,并非所有页面都需要登录并且页面是动态构建的
          【解决方案7】:

          在第一行使用 ob_start() 甚至在包含之前。所以你可以随时设置标题。

          【讨论】:

          • ob_start() 确实解决了这个问题,但我讨厌使用它,我想我需要了解它是如何更好地工作的,它需要将整个页面保存到内存中,而不是仅仅正确显示它?跨度>
          • 不是直接的。 php 始终使用输出缓冲区。但它的工作方式不同。普通缓冲区可以随时刷新到浏览器。使用输出缓冲只有一个缺点,你不能使用flush() 就是这样。
          猜你喜欢
          • 2013-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-28
          • 2011-12-06
          相关资源
          最近更新 更多