php 设置不带字符集的内容类型

amrnrhlw  于 2022-11-28  发布在  PHP
关注(0)|答案(1)|浏览(112)

我尝试将头文件Content-Type设置为text/html,但没有指定字符集。如果我运行以下代码:

header('Content-Type: text/html');
var_dump(headers_list());

我得到以下输出:

['Content-type: text/html;charset=UTF-8']

charset参数将自动添加!并且Content-Type将更改为Content-type。对于类型为text的任何内容类型也会发生同样的情况。例如,Content-Type: text/foobar将更改为Content-type: text/foobar;charset=UTF-8
如果我指定任何额外的参数,它们将被保留。例如,Content-Type: text/foobar; param=value将变为Content-type: text/foobar; param=value;charset=UTF-8
如果我指定charset参数,标头不会改变。例如,Content-Type: text/html; charset=ISO-8859-1保持Content-Type: text/html; charset=ISO-8859-1。在这种情况下,标头字段名称也不会从Content-Type更改为Content-type
如果指定的内容类型不是text,则标题不会更改。例如,Content-Type: foo/bar保持不变。
没有charset参数就不能指定基于文本的内容类型吗?我使用的是PHP 7.1.1和Apache 2.4.26。

ut6juiuv

ut6juiuv1#

我能想到的最好办法就是

\header('Content-Type: text/html; charset=');

它仍然在响应头中得到复制的verbatum,但至少阻止PHP插入默认字符集,并且浏览器(在Firefox和Chrome中测试过)似乎能够科普空的charset参数,因为它等同于'not-specified' -所以您可以在HTML文件中使用其中声明的任何字符集。
在我的例子中,有一些硬编码的HTML文件使用与默认字符集不同的字符集。(我没有测试),如果不解析我正在服务的文件,我不知道它应该设置为什么。也许可以在header调用之前执行\ini_set('default_charset', ''),但这可能会产生连锁React,而且可能不起作用(我还没有测试过)。
我认为这是PHP中的一个bug或缺点。它应该可以阻止PHP自动将charset参数添加到Content-Type头中,但显然没有。然而,我仍然在7.3上,所以也许事情已经改变了。
欢迎评论是否在https://bugs.php.net/提交错误或是否存在现有的未决问题。

相关问题