我在apache网络服务器上有一个PHP网站。该网站已经存在多年了。
几周前我不得不重新安装那台机器,所以我做了并检查了所有备份,重新安装了操作系统(Gentoo),并在新机器中使用相同版本的apache和php恢复了网站。
我快速检查了页面加载的情况并没有多少,一切似乎都很好。
今天我必须重新开始使用该网站,当我在浏览器中检查输出代码时,我发现了这一点:
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
问题是,Apache设置为以utf-8发送内容,php默认字符集为utf-8,文件全部保存为utf-8,PHP代码生成内容类型为utf-8 。 us-ascii值来自哪里?
在生成代码的PHP中,一切都是正确的
ob_start();
// check the output
var_dump( $tmp );exit( __FILE__.' '.__LINE__ );
// send the clean HTML document or the raw XML if something went wrong
if ( $tmp['final_document'] !== false ) {
echo( $tmp['final_document'] );
} else {
echo( $tmp['xml_content'] );
}
ob_end_flush();
上面的var_dump,输出具有正确Content-type
的XHTML源<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
但如果我正常发送页面,则编码为ascii。
据我记忆,我一直在做的唯一改变是设置mod_security,没有别的。
我应该检查什么?哪个文件?什么配置?
注意:
我只包含Apache标记,因为我认为问题与此有关,var_dump表明PHP正在生成代码。如果问题不同,我会相应地调整标签。
我更新了我的代码以反映情况和解决方案。
更新 - 解决方案:
根据建议,我从此部分中删除了解决方案,并将其添加为答案。
答案 0 :(得分:0)
问题是由网站中的一个配置行造成的,在配置部分,我有这个:
ini_set( 'tidy.clean_output', true );
但这次我没有安装整洁,因为我决定,不久前停止使用它并做自己的美化。在备份/恢复过程之前,我停止使用整洁,但它仍然安装在我的系统上,我显然忘记删除该配置行,因此该网站仍在使用它,至少使用了自我的个人配置以来的所有默认值整理被删除;它是在一个单独的文件中。
这个错误告诉我,当你使用整洁时,至少使用默认值,最终输出从PHP解析器变为整齐,从那里到Apache,再从那里到用户。我在内部流程的一个非常具体的部分使用整洁,所以我不知道/记住PHP默认情况下如何/何时向其发送信息。虽然因为我使用输出缓冲而在最后发送是有道理的。
我们可以在HTML Tidy Configuration Options中看到默认字符集是ascii。