PHP标头重定向问题(不,不是那个常见问题)

时间:2009-10-15 00:51:53

标签: php redirect

首先,这不是已经发送的标题'问题。

我有一个包含重定向的包含文件。这适用于我尝试过的每台服务器,生产服务器除外,它运行windows。

当我在生产服务器上运行它时,它只重定向包含文件,而不是整个页面。

我有主文件index.php:

<?php include('red.php'); ?>
<html ....
>

我将重定向到red.php中的另一个页面。然后重定向的页面将显示在index.php页面的顶部,其余的index.php html文件将显示在此页面之后。

搞砸了php.ini中的一些设置?

经过一番调查后,问题是当我使用完整的URL而不是相对URL时。第一个只会重定向包含的文件。 (我上面发现的问题)

而第二个正常工作

red2.php:

header("Location: http://example.com/newfile.php"); header("Location: newfile.php");'

2 个答案:

答案 0 :(得分:1)

  

当我在生产服务器上运行它时,它只重定向包含文件,而不是整个页面。

这是一个有趣的事情,因为它真的不可能。只有一个blob数据被呈现给浏览器,您不能“重定向”它的一部分,但您可以包含多个文件以生成复合blob。

也许,这就是你正在做的事情。也许你正在做一个包含而不是重定向。请记住,重定向是这样完成的:

header('Location: file.php');
exit;

建议在结尾处退出,这样执行就不会不必要地继续。

答案 1 :(得分:0)

约翰,

我认为你对客户端上发生的事情与服务器上发生的事情感到困惑。

当您致电include()时,服务器将在其本地文件系统中搜索您所包含的文件,并将直接执行该操作并逐行执行。

现在,当您在php中调用Header()函数时,这会改变浏览器将接收的标头数据。因此,重定向将在浏览器级别完成,而不是服务器级别。

这意味着拥有以下代码并不真正有意义:

<?php
# Doesn't matter if you call it through include() or directly
Header("Location: http://example.com/newfile.php");
?>
<html><p>Hello world</p></html>

就像你告诉浏览器一样:你需要重定向到newfile.php,但是这里有一些HTML内容供你显示。

如果要在服务器端包含newfile.php,则需要使用服务器端包含,CURL或只包含(“remote_file”); (如果remote_file位于另一台服务器上,即allow_url_fopen,则需要在php.ini中更改安全设置,以便后者工作。

希望有所帮助