【问题标题】:Apache 2.4 + XSendfile appends charset=utf-8 to content-type headerApache 2.4 + XSendfile 将 charset=utf-8 附加到内容类型标头
【发布时间】:2018-05-27 11:01:02
【问题描述】:

我们刚刚将我们的一个 Web 应用程序(经典灯堆栈)从 Ubuntu 14/Apache 2.2/PHP 5.5 迁移到 Ubuntu 16/Apache 2.4/PHP 7.0。一切都很顺利。目前让我头疼的只有一个部分:

我们应用程序中的一个路由检查传入的文件请求并通过 XSendfile(第三方内容)传送该文件。文件传递的内容类型由应用程序明确设置。这意味着,例如,我们为*.html 文件附加了text/html 的内容类型。这工作非常顺利,浏览器收到了确切的内容类型。

现在,在新机器上(相同的代码和相同的文件要交付),浏览器接收到的内容类型是text/html;charset=utf-8。有一些字符集元数据附加到内容类型。

这对我们来说很糟糕,因为有些文件包含iso-8859-1 编码的内容。结果是显示的 html 文件中的编码错误。

我已对所有内容进行了三次检查。我们在 HTTP 标头中放置的内容类型是显式设置的,没有 utf-8 字符集元数据。

现在我正在检查各种 Apache2/XSendfile 特定配置,以了解有关该行为的任何提示。

有没有其他人在使用 XSendfile 的 Apache 2.4 上遇到过类似的行为?是不是,Apache 发送的内容类型比 html 元标记中的内容类型更重要?如何禁用内容类型标头中字符集元信息的自动附加?

【问题讨论】:

    标签: apache utf-8 character-encoding iso-8859-1 x-sendfile


    【解决方案1】:

    我在一个期待text/html MIME 的Android 应用程序上遇到了完全相同的问题,导致havok,并发现它实际上是更新中更改的PHP 配置。在 PHP 5.6 中,他们将默认的 default_charset 设置从 "" 更改为 "UTF-8"

    您可以在适当的php.ini 中更改此设置,或者只是在header() 调用之前添加一个猴子补丁ini_set('default_charset', NULL);

    default_charset 字符串

    从 PHP 5.6 开始,“UTF-8”是默认值,如果省略 encoding 参数,它的值将用作 htmlentities()、html_entity_decode() 和 htmlspecialchars() 的默认字符编码...

    所有版本的 PHP 都将使用这个值作为 PHP 发送的默认 Content-Type 标头中的字符集,前提是该标头没有被 header() 调用覆盖。

    参考:http://php.net/manual/en/ini.core.php#ini.default-charset

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 2020-11-20
      • 2013-05-09
      • 2021-11-26
      • 2017-09-01
      • 2018-07-24
      • 2020-11-15
      • 2011-07-12
      相关资源
      最近更新 更多