0

可能重复:
PHP 已发送的标头

我网站的主 URL 将所有访问者重定向到本地子页面,我使用freegeoip.net和 PHP 来实现这一点:

<!DOCTYPE html>
<html>
<head>
<title>MLP Today</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="google-site-verification" content="*snip*" />
<?php
$csv = str_getcsv(file_get_contents('http://freegeoip.net/csv/'));
$geoloc = strtolower($csv[1]);

    if ($geoloc == 'hu' || 
        $geoloc == 'ro'){
        header("Location: hu/");
    }
    else if($geoloc == 'nl' || 
            $geoloc == 'be' || 
            $geoloc == 'de' || 
            $geoloc == 'sr' || 
            $geoloc == 'au'){
        header("Location: de/");
    }
    else {
        header("Location: en/");
    }
?>
<link rel="icon" type="image/png" href="img/favicon/favicon.png">
</head>
<body>
</body>
</html>

但是,当从我的本地 Apache 服务器加载站点时,我得到一个错误,说:

警告:无法修改标头信息 - 标头已由 D:\DJDavid\Dokumentumok\Dropbox\Web\Today\index 中的(输出开始于 D:\DJDavid\Dokumentumok\Dropbox\Web\Today\index.php:7)发送。第 13 行的 php

第 13 行是:header("Location: hu/");

我之前读过一些答案,但所有这些都是指实时网站,而不是 Apache Web-Servers。有人说我必须在 PHP 代码之前和之后删除所有内容,但这并没有帮助。此外,如您所见,我没有输出或返回任何内容,而这是导致此问题的第二大常见原因。第三个建议是使用ob_start(),但这也无济于事。

问题是,它在网络主机上完美运行,但当我使用localhost(本地服务器)在上线前预览更改时却不行。

我猜我必须改变一些东西,httpd.conf但我不知道是什么。

4

1 回答 1

0

如果您的服务器开始发送 HTTP 200 OK 响应和内容,例如:

<!DOCTYPE html>
<html>
<head>
<title>MLP Today</title>...

您无法将响应更改为 3xx 重定向。在发送任何内容之前尝试移动您的重定向逻辑。

另一种方法是打开缓冲输出,而不是通过以下方式尽可能快地发送它: ob_start()

这也可能是一个BOM问题(Windows 记事本在文件开头添加了三个字节)

于 2013-01-26T12:18:00.073 回答