我还没有看到带有或不带有这个头信息的区别。
我还没有看到带有或不带有这个头信息的区别。
定义“必要”。
如果您希望浏览器知道文件的类型,则需要它。如果您没有覆盖它,PHP会自动将Content-Type
头设置为text/html
,因此您的浏览器将其视为不包含任何HTML的HTML文件。如果您的输出包含任何HTML,则会看到非常不同的结果。如果您发送以下内容:
<b><i>test</i></b>
Content-Type: text/html; charset=UTF-8
将在浏览器中以粗体和斜体显示文本:
✅ OK
而 Content-Type: text/plain; charset=UTF-8
将在浏览器中像这样显示:
<b><i>✅ OK</i></b>
简短版:如果你只输出不带像<
或>
这样的特殊字符的普通文本,那么这并不是很重要,但这是错误的。
PHP使用默认的Content-Type为text/html
,这与text/plain
非常相似,这就解释了为什么你看不到任何区别。
text/plain
内容类型是必要的,如果您想原样输出文本(包括<
和>
符号)。
例子:
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
content-type
头部,它会改变浏览器呈现源代码的方式。 - Flimm非常重要的一点是,您需要告诉浏览器您正在发送的数据类型。这种差异应该是显而易见的。尝试在您的浏览器中查看以下PHP文件的输出结果;
<?php
header('Content-Type:text/html; charset=UTF-8');
?>
<p>Hello</p>
您将看到:
你好
(请注意,如果在此情况下省略标题行 - text/html是PHP的默认设置,则将获得相同的结果)
将其更改为text/plain
<?php
header('Content-Type:text/plain; charset=UTF-8');
?>
<p>Hello</p>
你将看到:
<p>Hello</p>
为什么这很重要?如果你在一个PHP脚本中有类似以下的代码,例如被一个AJAX请求使用:
<?php
header('Content-Type:text/html; charset=UTF-8');
print "Your name is " . $_GET['name']
有人可以在他们的网站上放置一个链接到URL,例如http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/script%3E,如果用户点击了它,他们会将你网站上的所有信息暴露给放置该链接的人。如果你将文件作为text/plain提供,你是安全的。
请注意,这只是一个愚蠢的例子,更可能的是,恶意脚本标记会由攻击者添加到数据库中的字段或通过使用表单提交。
设置Content-Type头将影响Web浏览器对您的内容的处理方式。当大多数主流Web浏览器遇到text/plain的Content-Type时,它们会在浏览器窗口中呈现原始文本源(而不是呈现为HTML源)。这就是看到的区别。
<b>foo</b>
或者
foo
此外,当使用 XMLHttpRequest
对象时,您的 Content-Type 标头将影响浏览器如何序列化返回的结果。在 AJAX 框架 jQuery 和 Prototype 接管之前,AJAX 响应的常见问题是 Content-Type 设置为 text/html 而不是 text/xml。如果 Content-Type 是 text/plain,则可能会出现类似的问题。