首先,这不是已经发送的标题'问题。
我有一个包含重定向的包含文件。这适用于我尝试过的每台服务器,生产服务器除外,它运行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");'
答案 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中更改安全设置,以便后者工作。
希望有所帮助