如何在PHP上声明多个标头

时间:2010-03-11 19:07:45

标签: php header

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

<?php

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

?>

当然我收到错误,因为我正在重新声明标题。起初我虽然它会好起来因为我在函数中包含它们并且我一次调用任何一个函数。但我仍然得到错误。还有其他方法吗?

9 个答案:

答案 0 :(得分:15)

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

Location标头指示客户端导航到另一个页面。您无法每页发送一个Location标题。

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

如果您指定两次相同的标头,默认情况下,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标头后继续执行。因此,请使用header()跟随exit的来电。这是一个正确的重定向功能:

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

答案 1 :(得分:3)

尝试这样的事情:

<?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);

?>

答案 2 :(得分:2)

要么他们不是全部都在执行,要么被调用的不止一个。

答案 3 :(得分:1)

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

从PHP手册

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

  
    

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

  

当您在发送任何输出后尝试调用header()时,您将收到以下错误...

  
    

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

  

答案 4 :(得分:1)

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

$headers = array(
   'Location' => 'http://www.stackoverflow.com',
   'Content-Type' => ' application/pdf',
);

foreach ($headers as $headerType => $headerValue)
{
   header($headerType . ': ' . $headerValue);
}

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

答案 5 :(得分:0)

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

header(one()); // for example

也许是这样的?

答案 6 :(得分:0)

你可以尝试类似的东西。

<?php
function one() {
   $redirect=pagea.".".php;

}
function two() {
   $redirect=pageb.".".php;

 }
function three() {
 $redirect=pagec.".".php;
}


header("location:".$redirect);
?>

答案 7 :(得分:0)

为了可能从谷歌来到这里的人,如果你有兴趣拥有多个相同的类型标题:

技术上可以在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);

答案 8 :(得分:0)

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

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

你可以随心所欲地做到这一点。 (没有别的东西对我和我来说这是一个不错的选择)

特别是对于那些使用多个选项的人来说,#34;标题&#34; (在我的网站上,无论我做什么,它总是只需要一个)