2

我在 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 代码生成一个 Content-Type 为 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 正在正确生成代码。如果问题有所不同,我会相应地调整标签。

我更新了我的标签以反映情况和解决方案。

更新 - 解决方案:

按照建议,我从这部分中删除了解决方案并将其添加为答案。

4

1 回答 1

0

问题是由网站中的一条配置行引起的,在配置部分,我有这个:

ini_set( 'tidy.clean_output', true );

但是这次我没有安装tidy,因为我决定,前一段时间停止使用它并做自己的美化。在备份/恢复过程之前,我停止使用 tidy,但它仍然安装在我的系统上,我显然忘记删除该配置行,所以该站点仍在使用它,至少使用自我个人配置以来的所有默认值tidy 被移除;它在一个单独的文件中。

这个错误告诉我,当您使用 tidy 时,至少使用默认值时,最终输出从 PHP 解析器到 tidy,从那里到 Apache,再从那里到用户。我过去常常在我的内部流程的一个非常特定的部分使用 tidy,所以我不知道/不记得 PHP 默认是如何/何时向它发送信息的。虽然因为我使用的是输出缓冲,所以最后发送是有道理的。

我们可以在HTML Tidy Configuration Options中看到默认字符集是 ascii。

于 2016-07-04T16:35:35.597 回答