-2

可能重复:
PHP 中的“警告:标头已发送”

您好,对于不在我网站中的页面,我无法获得 404 状态代码。我的 .htaccess 看起来像这样:

重写引擎开启

RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

因此,我所有的页面都从那里转到 index.php,它们转到引导程序,然后将其发送到错误控制器。在错误视图中进行:

header("HTTP/1.1 404 未找到");

但它给了我一个错误“无法修改标头信息 - 标头已发送”。现在,如果我删除此行,我会得到 200 Ok 状态。我认为这是因为我将所有内容都发送到 index.php 并且该状态为 200 Ok。那么如何从 .htaccess 中改变这些文件呢?或者你有其他方法来解决这个问题吗?谢谢

4

2 回答 2

1

可能您在错误的位置发送 HTTP 标头。

如果您使用的是 MVC PHP 框架,则需要阅读框架的文档以完全理解调度、路由和请求处理过程。答案取决于框架。必须有关于处理请求和发送标头的信息。

如果没有,那么 index.php 和引导文件是你自己的,你需要尝试在引导文件或控制器级别(错误控制器?)中发送 404 标头,而不是在视图文件中。视图层是在 MVC 结构中发送标头的不好地方。

另外不要忘记在发送标头之前确保您没有向客户端发送任何输出。

于 2012-11-04T22:52:41.227 回答
1

除了 foozy 的回答之外,请检查您的 PHP 代码在开始<?php标记之前是否有任何空格(空格、制表符、换行符等)。如果您发现任何内容,请将其删除。

如果有任何空格,这将导致“无法修改标头信息”错误。

Another useful way to debug this is to put an exit('stopped'); right before header("HTTP/1.1 404 Not Found");. When you refresh the page and view the source, ideally you should see stopped as the very first thing printed (with NO spacing in front). If spacing exists, there's the problem.

于 2012-11-05T00:46:50.120 回答