无论有没有这个头部信息,我都没有看到任何区别。
6 回答
定义“必要”。
如果您希望浏览器知道文件的类型,则必须这样做。如果您不覆盖它, PHP 会自动将Content-Type
标头设置为text/html
,因此您的浏览器会将其视为不包含任何 HTML 的 HTML 文件。如果您的输出包含任何 HTML,您会看到非常不同的结果。如果您要发送:
<b><i>test</i></b>
Content-Type: text/html; charset=UTF-8
将以粗体和斜体显示在浏览器文本中:
✅好的
而Content-Type: text/plain; charset=UTF-8
会像这样在浏览器中显示:
<b><i>✅ OK</i></b>
TLDR 版本:如果你真的只输出没有特殊字符的纯文本,比如<
or>
那么这并不重要,但这是错误的。
PHP 使用 Content-Typetext/html
作为默认值,这非常相似text/plain
,这解释了为什么您看不到任何差异。
text/plain
如果要按原样输出文本(包括<
和>
符号),则 content-type 是必需的。
例子:
header("Content-Type: text/plain");
echo "<b>hello world</b>";
// Displays in the browser: <b>hello world</b>
header("Content-Type: text/html");
echo "<b>hello world</b>";
// Displays in the browser with bold font: hello world
告诉浏览器您发送的数据类型非常重要。区别应该很明显。尝试在浏览器中查看以下 PHP 文件的输出;
<?php
header('Content-Type:text/html; charset=UTF-8');
?>
<p>Hello</p>
你会看见:
你好
(请注意,如果您在这种情况下错过了标题行,您将得到相同的结果 - text/html 是 php 的默认值)
将其更改为文本/纯文本
<?php
header('Content-Type:text/plain; charset=UTF-8');
?>
<p>Hello</p>
你会看见:
<p>你好</p>
为什么这很重要?如果您在 php 脚本中有类似以下内容,例如,ajax 请求使用该脚本:
<?php
header('Content-Type:text/html; charset=UTF-8');
print "Your name is " . $_GET['name']
有人可以在他们的网站上放置指向http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/script%3E 之类的 URL 的链接网站,如果用户点击它,他们就会将他们在您网站上的所有信息暴露给任何提供链接的人。如果您将文件作为文本/纯文本提供,那么您是安全的。
请注意,这是一个愚蠢的示例,攻击者更有可能将错误的脚本标签添加到数据库中的字段或使用表单提交。
设置 Content-Type 标头将影响 Web 浏览器如何处理您的内容。当大多数主流网络浏览器遇到 text/plain 的 Content-Type 时,它们会在浏览器窗口中呈现原始文本源(而不是在 HTML 中呈现的源)。这就是看见的区别
<b>foo</b>
或者
富
此外,在使用XMLHttpRequest
对象时,您的 Content-Type 标头将影响浏览器如何序列化返回的结果。在接管 jQuery 和 Prototype 等 AJAX 框架之前,AJAX 响应的一个常见问题是 Content-Type 设置为 text/html 而不是 text/xml。如果 Content-Type 是 text/plain,则可能会出现类似的问题。
假设您想以 204: No Content HTTP 状态回答请求。Firefox 将在浏览器的控制台中抱怨“找不到元素”。这是 Firefox 中的一个错误,多年来一直被报告,但从未修复。通过发送“Content-type: text/plain”标头,您可以防止在 Firefox 中出现此错误。
不,不是那样,这是支持我的答案的示例---->明显的区别是可见的,当您进行 HTTP 压缩时,它允许您在从服务器到客户端传输时压缩数据以及该数据自动变为“gzip”,它告诉浏览器 bowser 获得了压缩数据并且必须对其进行上压缩,这是 Type 在 Bowser 中非常重要的一个示例。