【问题标题】:How to declare more than one header on PHP如何在 PHP 上声明多个标头
【发布时间】:2010-03-11 19:07:44
【问题描述】:

我想根据用户操作将我的用户发送到不同的页面。所以我在页面顶部做了多个功能,如下所示:

<?php

function one() {
     header("location: pagea.php");
}
function two() {
     header("location: pageb.php");
}
function three() {
     header("location: pagec.php");
}

?>

当然我得到一个错误,因为我正在重新声明标题。起初我认为它会没事,因为我将它们包含在函数中并且一次调用任何一个函数。但我仍然得到错误。有没有其他方法可以做到这一点?

【问题讨论】:

  • 您遇到什么错误?这段代码看起来合法。
  • 能加代码如何依次调用函数一二三吗?

标签: php header


【解决方案1】:

我认为您误解了 HTTP 标头 Location 的作用。

Location 标头指示客户端导航到另一个页面。您不能在每页发送多个 Location 标头。

另外,PHP 在第一个输出之前发送标头。输出后,您不能再指定任何标头(除非您正在使用输出缓冲)。

如果两次指定相同的header,默认header()会用最新的替换之前的值...例如:

<?php
header('Location: a.php');
header('Location: b.php');
header('Location: c.php');

将用户重定向到c.php,绝不会经过a.phpb.php。您可以通过将false 值传递给第二个参数(称为$replace)来覆盖此行为:

<?php
header('X-Powered-By: MyFrameWork', false);
header('X-Powered-By: MyFrameWork Plugin', false);

Location 标头只能指定一次。发送多个 Location 标头不会将用户重定向到页面......它可能会混淆 UA 的废话。另外,请了解代码在发送Location 标头后继续执行。因此,请使用exit 拨打header() 的电话。这是一个正确的重定向功能:

function redirect($page) {
    header('Location: ' . $page);
    exit;
}

【讨论】:

    【解决方案2】:

    试试这样的:

    <?php
    
    $page = // use an if statement or whatever you need to figure out 
            //which page you need (pagea.php, etc.)
    
    fnx($page)
    
    function fnx($page) {
        header("location: " . $page);
    }
    
    ?>
    

    <?php
    
    $page = // use an if statement or whatever you need to figure out 
            //which page you need (pagea.php, etc.)
    
    header("location: " . $page);
    
    ?>
    

    【讨论】:

      【解决方案3】:

      它们不是全部在函数中,或者不止一个被调用。

      【讨论】:

        【解决方案4】:

        您收到该错误是因为您的脚本已经产生了输出(您在调用 header() 之前使用了 echo/print)。您需要在脚本产生任何输出之前调用 header()。

        来自 PHP 手册

        http://php.net/manual/en/function.header.php

        请记住,header() 必须在发送任何实际输出之前调用,可以通过普通的 HTML 标记、文件中的空行或 PHP。使用 include() 或 require()、函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。

        在发送任何输出后尝试调用 header() 时会出现以下错误...

        警告:无法修改标头信息 - 标头已发送

        【讨论】:

          【解决方案5】:

          当我需要发送多个标头时,我喜欢这样做:

          $headers = array(
             'Location' => 'http://www.stackoverflow.com',
             'Content-Type' => ' application/pdf',
          );
          
          foreach ($headers as $headerType => $headerValue)
          {
             header($headerType . ': ' . $headerValue);
          }
          

          使用headers_sent() 检查您是否能够发送标头。

          【讨论】:

            【解决方案6】:
            function one() {
                 return "location: pagea.php";
            }
            function two() {
                 return "location: pageb.php";
            }
            function three() {
                 return "location: pagec.php";
            }
            
            header(one()); // for example
            

            也许是这样的?

            【讨论】:

              【解决方案7】:

              你可以试试这样的。

              <?php
              function one() {
                 $redirect=pagea.".".php;
              
              }
              function two() {
                 $redirect=pageb.".".php;
              
               }
              function three() {
               $redirect=pagec.".".php;
              }
              
              
              header("location:".$redirect);
              ?>
              

              【讨论】:

                【解决方案8】:

                为了那些可能从 Google 来到这里的人,如果您有兴趣拥有多个相同 type 的标头:

                在 PHP 中传递多个相同类型的标头在技术上是可行的。 header 有一个名为“replace”的参数。 From the documentation:

                可选的replace 参数指示该标头是否应该替换先前的类似标头,或者添加第二个相同类型的标头。默认情况下它将替换,但如果您将 FALSE 作为第二个参数传入,您可以强制使用多个相同类型的标头。

                所以你应该可以写:

                header("location: pagea.php");         #You want to overwrite the initial one, so you'd have this one be default, or true
                header("location: pageb.php",false);
                header("location: pagec.php",false);
                

                当然,如果您的标头类型不能多次出现,则会出现错误。在这种情况下,您会收到此错误(在 Chrome 中以这种方式编写):

                此页面无法正常工作

                localhost 发送了无效响应。

                ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION

                但是,对于其他标题,此方法应该可以正常工作。他们提供的例子是:

                header('WWW-Authenticate: Negotiate');
                header('WWW-Authenticate: NTLM', false);
                

                【讨论】:

                  【解决方案9】:

                  我有一个很好的解决方案:

                  die(header("Location: someting.php"));
                  

                  您可以随心所欲地执行此操作。 (没有其他方法对我有用,对我来说这是一个不错的选择)。

                  特别是对于在使用多个“标题”选项时遇到问题的每个人(在我的网站上,无论我做什么,它总是只需要一个)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-05-23
                    • 2010-09-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-19
                    • 1970-01-01
                    • 2019-01-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多