什么是PHP标头?

时间:2010-09-11 18:54:18

标签: php http header

我想知道PHP标头是什么。我严格使用PHP来完成HTML,我认为我必须在输出文本时发送text / html标题,然后从单独的脚本中发送image / jpeg标题,该脚本在图像标记中用作源,但有人建议我带走标题因为它们什么也没做。

我做了,一切都和以前一样。这让我很奇怪:什么是标题?他们什么时候用? (既可以从HTML角度看,也可以从某些(?)其他角度看)我为什么要删除我的?

8 个答案:

答案 0 :(得分:56)

嗯,你看,当爸爸非常喜欢木乃伊时,他希望通过使用其大型网络服务器来证明他的爱,大量的HTML标签会出现在木乃伊的浏览器中。

但要做到这一点,他必须告诉木乃伊他打算做什么,否则木乃伊可能对爸爸的礼物感到非常惊讶。

因此,爸爸开始慢慢地和妈妈一起开始,向她解释他要发送哪种数据(哑剧/类型),他要讲哪种语言(charset),或者他要使用哪种保护(状态)码)。

PHP标题是一些玩具可以帮助你用大象做到这一点。呃...

答案 1 :(得分:29)

  

是否有DEFAULT标头?如果我只是将一些PHP发送到浏览器而没有指定标题..它将适用于哪个标题?

有许多不同的HTTP标头意味着不同的东西。如果您没有自己设置,PHP将为您提供重要的默认值。

我认为你专门讨论的标题是Content-Type。这告诉浏览器您发送的是哪种文件。如果您说text/html,它会尝试显示您将其作为网页显示的内容。如果您说application/pdf,它会尝试将其显示或下载为PDF文件。

PHP默认发送Content-Type: text/html。如果这就是你想要的,你根本不必打电话给header('Content-Type: ...');。但是,如果您使用任何非ASCII Unicode字符,您可能希望将Content-Type设置为text/html;charset=something,其中something是您正在使用的编码(通常为utf-8 1}})。否则浏览器将不得不猜测,可能会出错。常见的<meta http-equiv="Content-Type" content="text/html;charset=something"/>标签是做同样事情的另一种方式;如果你想要真正安全,你可以使用它们。

如果您将JPEG图片作为text/html投放,如果您通过删除header()来电跟随“某人”的可疑建议,那将会发生什么,然后转到图片的网址在浏览器中将尝试将二进制图像显示为HTML,这将在屏幕上为您提供大量旧垃圾。这真的不太好。

然而,在许多浏览器中,当您指向<img src>标记时,这种破损的JPEG通常仍然有效。这是因为当您使用<img>时,浏览器知道它将获取图像,并在您说它实际上是HTML时忽略您。然后它必须“嗅探”文件的内容以查看它是否看起来像JPEG,GIF,PNG或它知道的其他类型的图像,因此它知道如何显示它。浏览器已经这样做了,因为有很多写得不好的网站忘记发送标题。 BOO!

因此,当您编写JPEG或任何其他非HTML类型时,请务必发送header('Content-Type: image/jpeg')。对于HTML页面,您通常可以在没有它的情况下离开。

答案 2 :(得分:11)

标题不是特定于浏览器的,它是HTTP协议的一部分  对页面(或任何其他资源,如图像)的请求将使客户端(例如,因特网浏览器)发送请求标头。例如,这可能包含语言标题(Accept-Language)。

HTTP请求的第一行格式为METHOD RESOURCE HTTP/VERSION。示例:GET /resource HTTP/1.0
HTTP / 1.1需要Host-header。 HTTP / 1.1请求示例:

GET / HTTP/1.1
Host: example.com

服务器至少响应状态代码:HTTP/1.1 200 OK
大多数服务器将发送其他标头。常见标题为:Content-TypeDateServerContent-Length

这是一个示例请求(原始数据):

$ nc example.com 80
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 11 Sep 2010 19:12:13 GMT
Server: Apache
Last-Modified: Fri, 30 Jul 2010 15:30:18 GMT
ETag: "573c1-254-48c9c87349680"
Accept-Ranges: bytes
Content-Length: 596
Connection: close
Content-Type: text/html; charset=UTF-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
  <META http-equiv="Content-Type" content="text/html; charset=utf-8">
  <TITLE>Example Web Page</TITLE>
</HEAD> 
<body>  
<p>You have reached this web page by typing &quot;example.com&quot;,
&quot;example.net&quot;,&quot;example.org&quot
  or &quot;example.edu&quot; into your web browser.</p>
<p>These domain names are reserved for use in documentation and are not available 
  for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 
  2606</a>, Section 3.</p>
</BODY>
</HTML>

由客户端(Internet浏览器)决定是否解析标头。所有现代Internet浏览器都会解析Content-Type标头,并使用它来确定如何显示资源(它是HTML页面,图像,文本文件还是其他什么?)。浏览器会忽略Server标头,服务器会使用它标识自己。但是一些爬虫可能会将其用于统计。

来自HTTP specification

的引用
  

多个消息标题字段   可能存在相同的字段名称   当且仅当整个   该标题字段的字段值是   定义为以逗号分隔的列表   [即#(值)]。它必须是可能的   组合多个标题字段   成为一个“字段名称:字段值”   对,不改变语义   通过附加每个消息   后续的字段值到第一个,   每个用逗号分隔。

这意味着多个Content-Type字段无效,并且行为未定义(尽管使用最后定义的字段很常见)。

This Wikipedia article包含带描述的标题列表。

答案 3 :(得分:4)

标题不是php的东西,它是HTTP的东西(通过互联网传输数据的方式)。

php中的header()函数允许您设置这些标题以对应代码的使用,因此如果您的代码生成jpg而不是通常的文本(如html或javascript那么)由用户的浏览器解释)您将coressponding标头设置为image/jpeg。现在,您可以在其他地方使用此脚本,就像它在静态图像中一样,如:

<img src="static.jpg"/>

现在,如果你想生成图像的缩略图,并想要动态访问它,你可以编写一个返回jpeg的php脚本,你可以像这样使用它:

<img src="thumb.php?s=64&name=static.jpg"/>"

thumb.php文档将从图像static.jpg生成64x64拇指(使用HTTP标头Content-Type: image/jpeg

当然,这只是header()函数的众多用法之一,对于附加信息,请查看维基百科:Hypertext Transfer ProtocolList of HTTP header fields,或者如果您是勇敢的足够的,在rfc

答案 4 :(得分:2)

假设您的意思是header()函数。

这是一种添加/更改发送到浏览器的HTTP标头的方法。

您可能需要在HTTP规范中查找这些标头的列表。

例如,您可能正在开发XML RSS Feed,因此您需要将Content-Type更改为“text / xml”而不是“text / html”(默认)。

答案 5 :(得分:2)

标题包含浏览器告诉它以某种方式呈现内容的说明。例如,指定要使用的页面语言/字符集,或者告诉浏览器要输出的数据是原始图像数据,因此将其作为图像处理(与常规文本相对),或者您可以像标题一样处理(“位置: somepage.html“)让浏览器重定向到另一个页面。基本上你可以在普通的<head>...</head>标签中找到很多东西(然后是一些东西)。

答案 6 :(得分:1)

HTTP请求/响应标头(在您的案例响应中)是元数据,它们与响应一起发送(更确切地说,在数据之前)。

它可能包含缓存指令,数据类型和大小,上次修改日期等信息。您可以看到HTTP标头列表here

答案 7 :(得分:0)

应该区分进入标题(php充当Web服务器页面)和传出标题(php充当使用cURL库之类的东西的Web客户端)。

Headers实际上只是另一个名称 - 值对的包,它通过每个HTTP“请求”事务进行连接。 Body是服务器发回的东西,服务器还向客户端发回了响应头。

任一标头中的每个名称 - 值对都由HTTP协议和其他标准定义,但客户端和服务器也可以将标头用于其他用途。

headers()用于设置响应头名称 - 值对,而getallheaders()用于检索发送到php服务器页面的请求头。