PHP标头重定向无法正常工作

时间:2009-08-06 23:18:14

标签: php redirect

我知道之前已经介绍过但我找不到答案,

我一直用这个;

header("Location: http://www.website.com/");
exit();

这一直在我当前的项目中工作,突然之间它在我的任何浏览器中都无效

我想找出问题并修复它而不是使用

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>";

我也启用了错误报告,但没有显示错误

// SET ERROR REPORTING
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
ini_set('display_errors', TRUE);

任何想法为什么不起作用?

13 个答案:

答案 0 :(得分:18)

尝试:

error_reporting(E_ALL | E_WARNING | E_NOTICE);
ini_set('display_errors', TRUE);


flush();
header("Location: http://www.website.com/");
die('should have redirected by now');

看看你得到了什么。你不应该在你的error_reporting()调用中使用^(xor),因为你无意中要求所有错误除了通知和警告..这就是“已经发送的标题”错误。

编辑:

同时尝试将flush()放在header()调用的正上方。

答案 1 :(得分:14)

尝试删除位置之间的空格和http中的第一个h。

header("Location: http://www.website.com/");
exit();

变成

header("Location:http://www.website.com/");
exit();

我的WAMP服务器出现了这个问题。

虽然它应该不是问题,但考虑到它是如何在PHP文档中记录的。但无论如何你应该尝试一下。我知道在很多情况下它对我有用。

答案 2 :(得分:12)

常见问题:

1) echo.. 之前不应有任何输出(即 header(.......); 或HTML代码)命令。

2) <?php之前和{{1}之后不应该有空格(或换行) }标签。

3) GOLDER RULE! - 文件(和其他?> - d个文件)应该包含 UTF8,不含BOM 编码(而不仅仅是 UTF-8 )。这在许多情况下都是问题(因为典型的 UTF8 编码文件在文件输出的开头有一些特殊字符)!!!!!!!!!!!

4) 重定向时,include()之后必须使用header(...);

5)建议的做法 - 始终在参考中使用301或302:

exit;

6)如果上述方法都没有帮助,请使用JAVSCRIPT重定向(但Google强烈建议不要这样做),但这可能是最后的机会......:

header("location: http://example.com",  true,  301 );  exit;

答案 3 :(得分:4)

试试这个。为我工作。

echo "<meta http-equiv='refresh' content='0;url=http://www.yoursite.com'>";

答案 4 :(得分:1)

此外,当您使用标头功能时,它必须是在将任何文本(甚至是空格)写入客户端之前调用的第一件事,因此请再次检查在您通话之前是否还没有输出空格

<?php

答案 5 :(得分:1)

这可能是奇怪的解决方案,但尝试这一点,将页面编码从utf8更改为ANSI,它将起作用。

使用任何文本编辑器并将页面保存为ANSI编码并将其上传到您的在线服务器。

答案 6 :(得分:1)

添加ob_start()解决了这个问题。

答案 7 :(得分:0)

访问该页面时会发生什么?您可以尝试使用Firebug或任何其他工具来分析HTTP标头并检查重定向是否真的发生以及Location标头是否真的存在。

答案 8 :(得分:0)

您还应该验证您是否重定向到有效位置,并且该位置具有正确的404和500错误消息/页面设置。可能是你只是重定向一个不好的地方。

答案 9 :(得分:0)

很奇怪,但删除php中的空行对我有用: - \

之前

代码:

<?php

header("Location: http://www.website.com/");

?>

有效的代码:

<?php header("Location: http://www.website.com/"); ?>

答案 10 :(得分:0)

试试这个(为我工作):

echo '<script>window.location.replace("http://www.example.com")</script>';

而不是

header("Location: http://www.example.com");

答案 11 :(得分:0)

如果索引页面是html文件,则可能无效。将其更改为index.php并使用以下代码:

<?php

header("Location: http://ea.tc");

?>

答案 12 :(得分:0)

我实际上有一个与此相似的案例,我的管理页面包含在我所有其他页面的顶部。在该行下方每页的顶部:

<?php include '../../admin.php' ?>

我会有php逻辑:

<?php if($_SESSION['username'] === null){ header("Location: ./adminLogin.php");}?>

这个问题是在其他地方我也在调用/操纵header(...。在经过我的代码很多时间之后,我承认我无法弄清楚问题出在哪里。然后我想在执行任何其他操作之前,每个文件都会访问我的admin.php文件。所以我想到如果我将每个视图顶部的逻辑放入我的admin.php文件中(因为除非你已经登录,我不希望任何东西可见),我会想到会发生什么?

发生了什么事情之前它甚至在我的视图中得到了任何一个php / html它评估了某人是否已登录($_SESSION['username'])),如果它是NULL那么我只是重定向到adminLogin页面。我把这个逻辑放在我的开关之前,它对我曾经需要逻辑的所有文件都很有效。我的方式在开发中起作用,但在生产中提出了很多问题。我发现将重定向逻辑移到我的admin.php文件不仅避免了重复的header(...操作,而且通过从我的视图文件中移除多余的逻辑并进入我的admin.php,实际上使我的代码更有效率文件。

不要将逻辑放在每个视图文件中,而是在切换之前将其放入控制器中一次。奇迹般有效!如果您不希望任何人访问任何敏感视图,除非他们登录,这非常有用。在我的情况下,这对我的CMS很重要。但是,如果有一些文件要在不登录的情况下可以查看,那么我认为原始逻辑就足够了。您似乎已经找到了解决方案,但希望如果您再次遇到此错误,这可能会有所帮助。 :)