无论你是否是一个程序员,你都在网络上看到了它的存在。甚至你的第一个Hello World PHP脚本也在不知不觉中发送了HTTP头信息。在这篇文章中,我们将学习HTTP头信息的基本知识,以及如何在我们的网络应用中使用它们。
什么是HTTP头信息?
HTTP是 "超文本传输协议 "的缩写。整个万维网都使用这个协议。它是在20世纪90年代初建立的。你在浏览器中看到的几乎所有东西都是通过HTTP传输到你的计算机的。例如,当你打开这篇文章的页面时,你的浏览器可能发出了40多个HTTP请求,并为每个请求收到了HTTP响应。
HTTP头是这些HTTP请求和响应的核心部分,它们携带着关于客户端浏览器、被请求的页面、服务器等的信息。



例子
当你在地址栏中输入一个URL时,你的浏览器会发送一个HTTP请求,它可能看起来像这样。
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: code.tutsplus.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
Pragma: no-cache
Cache-Control: no-cache
第一行是 "请求行",它包含了请求的一些基本信息。其余的是HTTP头信息。
在这个请求之后,你的浏览器会收到一个HTTP响应,它可能看起来像这样。
HTTP/1.x 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Nov 2009 04:36:25 GMT
Server: LiteSpeed
Connection: close
X-Powered-By: W3 Total Cache/0.8
Pragma: public
Expires: Sat, 28 Nov 2009 05:36:25 GMT
Etag: "pub1259380237;gz"
Cache-Control: max-age=3600, public
Content-Type: text/html; charset=UTF-8
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
X-Pingback: https://code.tutsplus.com/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding, Cookie, User-Agent
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Top 20+ MySQL Best Practices - Nettuts+</title>
<!-- ... rest of the html ... -->
第一行是 "状态行",接着是 "HTTP头信息",直到空白行。在这之后,"内容 "开始了(在这里是指HTML输出)。
当你在浏览器中查看网页的源代码时,你只会看到HTML部分,而不会看到HTTP头信息,尽管它们实际上是一起被传送的,正如你在上面看到的。
这些HTTP请求也是为其他东西而发送和接收的,如图像、CSS文件、JavaScript文件等。这就是为什么我前面说,在你加载这个文章页面时,你的浏览器至少发送了40个以上的HTTP请求。
现在,让我们开始更详细地回顾这个结构。
如何查看HTTP头信息
我使用Firefox Firebug来分析HTTP头信息,但你也可以使用Firefox、Chrome或任何现代Web浏览器中的开发工具来查看HTTP头信息。
在PHP中。
[getallheaders()](http://php.net/manual/en/function.getallheaders.php)获取请求头信息。你也可以使用$_SERVER数组。[headers_list()](http://www.php.net/manual/en/function.headers-list.php)获取响应头信息。
在文章的后面,我们将看到一些在PHP中的代码例子。
HTTP请求结构

HTTP请求的第一行被称为请求行,由三部分组成:
- 方法 "表示这是什么类型的请求。最常见的方法是GET、POST和HEAD。
- 路径 "一般是指URL中在主机(域名)之后的部分。例如,当请求 "code.tutsplus.com/tutorials/t… "时,路径部分是"/tutorials/top-20-mysql-best-practices--net-7855"。
protocol部分包含HTTP和版本,在现代浏览器中通常为 1.1。
请求的其余部分包含HTTP头,在每一行都是Name: Value 对。这些包含了关于HTTP请求和你的浏览器的各种信息。例如,User-Agent 行提供了关于浏览器版本和你所使用的操作系统的信息。Accept-Encoding 告诉服务器你的浏览器是否能接受像gzip这样的压缩输出。
你可能已经注意到,cookie数据也是在HTTP头内传输的。而且,如果有一个引用的URL,那也会在头信息中出现。
这些头文件大多是可选的。这个HTTP请求本来可以小到这个程度。
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: code.tutsplus.com
而你仍然会从网络服务器得到一个有效的响应。
请求方法
三个最常用的请求方法是GET、POST和HEAD。你可能已经从编写HTML表单中熟悉了前两种方法。
GET:检索一个文件
这是用于检索HTML、图片、JavaScript、CSS等的主要方法。在你的浏览器中加载的大多数数据都是用这种方法请求的。
例如,当加载Envato Tuts+文章时,HTTP请求的第一行是这样的。
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
...
一旦HTML加载完毕,浏览器就会开始发送图片的GET请求,这些请求可能看起来像这样。
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
...
网络表单可以被设置为使用GET方法。下面是一个例子。
<form method="GET" action="foo.php">
First Name: <input type="text" name="first_name" /> <br />
Last Name: <input type="text" name="last_name" /> <br />
<input type="submit" name="action" value="Submit" />
</form>
当该表单被提交后,HTTP请求开始像这样。
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
你可以看到每个表单输入都被添加到查询字符串中。
POST:向服务器发送数据
尽管你可以使用GET和查询字符串向服务器发送数据,但在许多情况下,POST会更受欢迎。使用GET发送大量的数据是不实际的,而且有局限性。
POST请求最常见的是由Web表单发送。让我们把前面的表单例子改为POST方式。
<form method="POST" action="foo.php">
First Name: <input type="text" name="first_name" /> <br />
Last Name: <input type="text" name="last_name" /> <br />
<input type="submit" name="action" value="Submit" />
</form>
提交该表单会产生一个这样的HTTP请求。
POST /foo.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
first_name=John&last_name=Doe&action=Submit
这里有三件重要的事情要注意:
- 第一行中的路径只是
/foo.php,而且不再有查询字符串。 Content-Type和Content-Lengthheaders,它们提供了关于正在发送的数据的信息。- 现在所有的数据都在头文件之后发送,格式与查询字符串相同。
POST方法请求也可以通过AJAX、应用程序、cURL等进行。而所有的文件上传表格都需要使用POST方法。
HEAD:检索头信息
HEAD与GET相同,只是服务器不在HTTP响应中返回内容。当你发送HEAD请求时,意味着你只对响应代码和HTTP头信息感兴趣,而不是文件本身。
通过这种方法,浏览器可以检查一个文档是否被修改过,以达到缓存的目的。它还可以检查该文档是否存在。
例如,如果你的网站上有很多链接,你可以定期向所有的链接发送HEAD请求,检查是否有断裂的链接。这将比使用GET快得多。
HTTP响应结构
在浏览器发送HTTP请求后,服务器会以HTTP响应的方式进行回应。除去内容,它看起来像这样。

第一条数据是协议。这通常又是HTTP/1.x或现代服务器上的HTTP/1.1。
接下来的部分是状态代码,然后是一个简短的信息。代码200意味着我们的GET请求是成功的,服务器将返回所请求的文件的内容,就在头文件之后。
我们都见过404页面。这个数字实际上来自于HTTP响应的状态代码部分。如果对一个服务器找不到的路径提出了GET请求,它将以404而不是200作为响应。
响应的其余部分包含头信息,就像HTTP请求一样。这些值可以包含关于服务器软件的信息,页面/文件最后一次被修改的时间,MIME类型,等等。
同样,这些标头中的大多数实际上是可选的。
HTTP状态代码
- 200s用来表示成功的请求。
- 300s是用于重定向。
- 400s用于请求有问题的情况。
- 如果服务器有问题,则使用500s。
200 OK
如前所述,这个状态代码是对成功请求的响应。
206 部分内容
如果一个应用程序只请求所请求文件的一个范围,就会返回206代码。它最常用于下载管理器,可以停止和恢复下载,或将下载分成几部分。
404 未找到

当请求的页面或文件没有找到时,服务器会发送一个404响应代码。
401 未授权
受密码保护的网页会发送这个代码。如果你没有正确输入登录名,你可能会在浏览器中看到以下内容。

请注意,这只适用于像这样弹出登录提示的HTTP密码保护网页。

403禁止
如果你不被允许访问一个页面,这个代码可能被发送到你的浏览器。这经常发生在你试图打开一个不包含索引页的文件夹的URL时。如果服务器设置不允许显示文件夹的内容,你会得到一个403错误。
例如,在我的本地服务器上,我创建了一个图像文件夹。在这个文件夹内,我放了一个**.htaccess文件,其中有这样一行。"Options -Indexes"。 现在,当我试图打开http://localhost/images/,**我看到这个。

还有其他方法可以阻止访问并发送403响应。例如,你可以在一些htaccess指令的帮助下,通过IP地址进行阻止。
order allow,deny
deny from 192.168.44.201
deny from 224.39.163.12
deny from 172.16.7.92
allow from all
302(或307)暂时移动和301永久移动
这两个代码是用来重定向浏览器的。例如,当你使用URL缩短服务,如bit.ly,这正是他们转发点击其链接的人的方式。
302和301在浏览器中的处理方式非常相似,但它们对搜索引擎蜘蛛有不同的意义。例如,如果你的网站因维护而关闭,你可以使用302重定向到另一个地方。搜索引擎蜘蛛会在以后继续检查你的页面。但如果你使用301重定向,它将告诉蜘蛛,你的网站已经永久地移到了那个位置。例如,net.tutsplus.com重定向到code.tutsplus.com-that是新的规范性URL。
500内部服务器错误
这个代码通常出现在网络脚本崩溃的时候。大多数CGI脚本不直接向浏览器输出错误,这与PHP不同。如果有任何致命的错误,它们会直接发送一个500状态代码。而程序员就需要搜索服务器的错误日志来找到错误信息。
HTTP请求中的HTTP头信息
现在,我们来回顾一下HTTP请求中一些最常见的HTTP头。
几乎所有这些头信息都可以在PHP的$_SERVER 数组中找到。你也可以使用 [getallheaders()](http://php.net/manual/en/function.getallheaders.php)函数来一次性检索所有的头信息。
Host
一个HTTP请求被发送到一个特定的IP地址。但是,由于大多数服务器能够在同一IP下托管多个网站,它们必须知道浏览器正在寻找哪个域名。
Host: code.tutsplus.com
这基本上就是主机名,包括域名和子域名。
在PHP中,它可以被发现为$_SERVER['HTTP_HOST'] 或$_SERVER['SERVER_NAME'] 。
User-Agent
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
这个头可以携带几条信息,例如
- 浏览器名称和版本
- 操作系统名称和版本
- 默认语言
这就是网站如何收集关于网友系统的某些一般信息。例如,他们可以检测冲浪者是否使用手机浏览器,并将他们重定向到他们的网站的移动版本,这在小屏幕上效果更好。
在PHP中,它可以通过以下方式找到。$_SERVER['HTTP_USER_AGENT'].
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
echo "Please stop using IE6!";
}
Accept-Language
Accept-Language: en-us,en;q=0.5
这个标头显示用户的默认语言设置。如果一个网站有不同的语言版本,它可以根据这些数据重定向一个新的冲浪者。
它可以携带多种语言,用逗号分隔。第一种是首选语言,其他每一种列出的语言都可以带有一个 "q"的值,这是对用户语言偏好的一个估计(最小0最大1)。
在PHP中,它可以被发现为。$_SERVER["HTTP_ACCEPT_LANGUAGE"].
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
header('Location: http://french.mydomain.com');
}
Accept-Encoding
Accept-Encoding: gzip,deflate
大多数现代浏览器都支持gzip,并将在标题中发送这个值。然后,Web服务器可以以压缩格式发送HTML输出。这可以减少多达80%的大小,以节省带宽和时间。
在PHP中,可以发现它是这样的。$_SERVER["HTTP_ACCEPT_ENCODING"].然而,当你使用 [ob_gzhandler()](http://www.php.net/manual/en/function.ob-gzhandler.php)回调函数时,它将自动检查这个值,所以你不需要这样做。
// enables output buffering
// and all output is compressed if the browser supports it
ob_start('ob_gzhandler');
If-Modified-Since
如果一个网络文件已经被缓存在你的浏览器中,而你再次访问它,你的浏览器可以通过发送这个来检查该文件是否被更新。
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
如果自该日期以来没有修改,服务器将发送一个 "304 Not Modified "响应代码,并且没有内容--浏览器将从缓存中加载内容。
在PHP中,它可以被发现为。$_SERVER['HTTP_IF_MODIFIED_SINCE'].
// assume $last_modify_time was the last the output was updated
// did the browser send If-Modified-Since header?
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// if the browser cache matches the modify time
if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// send a 304 header, and no content
header("HTTP/1.1 304 Not Modified");
exit;
}
}
还有一个名为Etag的HTTP头,它可以用来确保缓存是最新的。我们很快就会讲到这个。
Cookie
顾名思义,这将发送存储在浏览器中的该域名的cookies。
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
这些是由分号分隔的name=value对。Cookies也可以包含会话ID。
在PHP中,可以用$_COOKIE 数组来访问单个cookie。你可以用$_SESSION 数组直接访问会话变量,如果你需要会话ID,你可以用session_id() 函数代替cookie。
echo $_COOKIE['foo'];
// output: bar
echo $_COOKIE['PHPSESSID'];
// output: r2t5uvjq435r4q7ib3vtdjq120
session_start();
echo session_id();
// output: r2t5uvjq435r4q7ib3vtdjq120
Referer
顾名思义,这个HTTP标头包含了引用的URL。
例如,如果我访问Envato Tuts+ Code主页并点击一个文章链接,这个头就会被发送到我的浏览器。
Referer: https://code.tutsplus.com/
在PHP中,它可以被发现为$_SERVER['HTTP_REFERER'] 。
if (isset($_SERVER['HTTP_REFERER'])) {
$url_info = parse_url($_SERVER['HTTP_REFERER']);
// is the surfer coming from Google?
if ($url_info['host'] == 'www.google.com') {
parse_str($url_info['query'], $vars);
echo "You searched on Google for this keyword: ". $vars['q'];
}
}
// if the referring URL was:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// the output will be:
// You searched on Google for this keyword: http headers
你可能已经注意到 "referrer "这个词被错写成了 "referer"。不幸的是,它就这样进入了官方的HTTP规范并被卡住了。
授权
当一个网页要求授权时,浏览器会打开一个登录窗口。当你在这个窗口中输入用户名和密码时,浏览器就会发出另一个HTTP请求,但这次它包含这个头。
Authorization: Basic bXl1c2VyOm15cGFzcw==
头部里面的数据是base64编码的。例如,base64_decode('bXl1c2VyOm15cGFzcw==') 会返回'myuser:mypass' 。
在PHP中,这些值可以作为$_SERVER['PHP_AUTH_USER'] 和$_SERVER['PHP_AUTH_PW'] 。
在我们讨论WWW-Authenticate头的时候,会有更多的内容。
HTTP响应中的HTTP头
现在我们来看看HTTP响应中一些最常见的HTTP头。
在PHP中,你可以使用函数来设置响应头信息。 [header()](http://php.net/manual/en/function.header.php)函数来设置响应头。PHP已经自动发送了某些头信息,用于加载内容、设置cookies等。你可以看到已经发送或将要发送的头信息,用 [headers_list()](http://www.php.net/manual/en/function.headers-list.php)函数查看已经或将要发送的头信息。可以用函数检查头信息是否已经发送。 [headers_sent()](http://www.php.net/manual/en/function.headers-sent.php)函数检查头信息是否已经发送。
Cache-Control
下面是w3.org的定义。
Cache-Control通用头用来指定请求/响应链上的所有缓存机制都必须遵守的指令。
这些 "缓存机制 "包括你的ISP可能使用的网关和代理。
例如
Cache-Control: max-age=3600, public
public 意味着响应可以被任何人缓存。 表示缓存的有效期为多少秒。允许你的网站被缓存可以减少服务器的负载和带宽,以及改善浏览器的加载时间。max-age
缓存也可以通过使用no-cache 指令来防止。
Cache-Control: no-cache
Content-Type
这个头表示文件的 "MIME类型"。然后,浏览器根据这个决定如何解释内容。例如,一个HTML页面(或一个有HTML输出的PHP脚本)可能会返回这个。
Content-Type: text/html; charset=UTF-8
text 是类型,而 是文档的子类型。头部还可以包含更多的信息,如字符集。html
对于GIF图像,可能会发送这个:
Content-Type: image/gif
浏览器可以根据MIME类型决定是否使用外部应用程序或浏览器扩展。例如,这将导致Adobe Reader或浏览器的内置PDF阅读器被加载。
Content-Type: application/pdf
直接加载时,Apache通常可以检测到文档的MIME类型,并发送适当的头信息。另外,大多数浏览器都有一定的容错能力和自动检测MIME类型的功能,以防头文件出错或不存在。
你可以在MDN网络文档中找到一个常见的MIME类型的列表。
在PHP中,你可以使用 [finfo_file()](http://www.php.net/manual/en/function.finfo-file.php)函数来检测文件的 MIME 类型。
Content-Disposition
这个标头指示浏览器打开一个文件下载框,而不是试图解析内容。比如说。
Content-Disposition: attachment; filename="download.zip"
这将使浏览器这样做。

请注意,适当的Content-Type 标头也应与此一起发送。
Content-Type: application/zip
Content-Disposition: attachment; filename="download.zip"
Content-Length
当内容要传输给浏览器时,服务器可以用这个头来表示其大小(以字节为单位)。
Content-Length: 89123
这对文件下载特别有用。这样,浏览器就可以确定下载的进度。
例如,这是我写的一个假脚本,它模拟了一个大型下载。
// it's a zip file
header('Content-Type: application/zip');
// 1 million bytes (about 1megabyte)
header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');
// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
echo str_repeat(".",1000);
// sleep to slow down the download
usleep(50000);
}
其结果是

现在我打算注释掉Content-Length头。
// it's a zip file
header('Content-Type: application/zip');
// the browser won't know the size
// header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');
// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
echo str_repeat(".",1000);
// sleep to slow down the download
usleep(50000);
}
现在的结果是。

浏览器只能告诉你已经下载了多少字节,但它不知道总量。而且进度条也不显示进度。
Etag
这是另一个用于缓存的标头。它看起来像这样。
Etag: "pub1259380237;gz"
网络服务器可以在其提供的每个文件中发送这个头。这个值可以基于最后的修改日期、文件大小,甚至是文件的校验和值。然后,浏览器在缓存文件时保存这个值。下次浏览器请求同一文件时,它将在HTTP请求中发送这个值。
If-None-Match: "pub1259380237;gz"
如果文件的Etag值与此相符,服务器将发送一个304代码,而不是200,并且没有内容。浏览器将从其缓存中加载该内容。
Last-Modified
顾名思义,这个头表示文档的最后修改日期,以GMT格式表示。
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");
它为浏览器提供了另一种缓存文档的方法。浏览器可以在HTTP请求中发送这个信息。
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
我们在前面的If-Modified-Since 部分已经谈到了这一点。
Location
这个标头用于重定向。如果响应代码是301或302,服务器也必须发送这个头。例如,当你转到net.tutsplus.com,你的浏览器会收到这个。
HTTP/1.x 301 Moved Permanently
...
Location: https://code.tutsplus.com/
...
在PHP中,你可以这样重定向一个冲浪者。
header('Location: https://code.tutsplus.com/');
默认情况下,这将发送一个302响应代码。如果你想发送一个301来代替。
header('Location: https://code.tutsplus.com/', true, 301);
Set-Cookie
当一个网站想在你的浏览器中设置或更新一个cookie时,它将使用这个头。
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT
每个cookie都作为一个单独的标头发送。注意,通过JavaScript设置的cookie不通过HTTP头。
在PHP中,可以用 [setcookie()](http://php.net/manual/en/function.setcookie.php)函数来设置 cookie,而 PHP 会发送相应的 HTTP 头信息。
setcookie("TestCookie", "foobar");
这导致这个头信息被发送。
Set-Cookie: TestCookie=foobar
如果没有指定过期日期,当浏览器窗口关闭时,cookie将被删除。
WWW-Authenticate
网站可以通过HTTP发送此标头来验证用户的身份。当浏览器看到这个标头时,它将打开一个登录对话窗口。
WWW-Authenticate: Basic realm="Restricted Area"
它看起来像这样。

在PHP手册中,有一节是关于如何在PHP中做到这一点的代码样本。
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
Content-Encoding
这个头信息通常在返回的内容被压缩时设置。
Content-Encoding: gzip
在PHP中,如果你使用 [ob_gzhandler()](http://www.php.net/manual/en/function.ob-gzhandler.php)回调函数,它将自动为你设置。
如何发送HTTP头信息
在阅读了本教程到此为止的内容后,你应该对什么是HTTP头以及它们的不同值意味着什么有了一个很好的概念。当你向服务器发出请求并得到响应时,有些头信息会自动发送和接收。
然而,在有些情况下,除了客户端或服务器发送的头信息外,你还想发送自己的自定义头信息。
在请求中发送自己的头信息的最常见方法之一是使用PHP中的cURL库。该库带有一堆函数来处理你的所有需求。其中有四个基本步骤。
- 你使用
curl_init()来启动你的cURL会话。你可以把你想请求的URL传给它。 curl_setopt()函数用于根据你的需要配置请求。这时,你可以通过使用CURLOPT_HTTPHEADER选项来设置你自己的头文件。- 在你设置了所有的选项之后,你可以通过调用
curl_exec()来执行请求。 - 最后,你可以通过调用
curl_close()函数来关闭会话。
下面是一个基本的例子,它向code.tutsplus.com/tutorials 发送一个请求。
<?php
$ch = curl_init("https://code.tutsplus.com/tutorials");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0",
"Accept-Language: en-US,en;q=0.5"
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
?>
如果你想在PHP中发送响应头信息,那么你应该使用header() 函数。在其他方面,一个常见的用途是将访问者重定向到其他页面。这可以通过使用Location 标头来实现。下面是一个例子。
<?php
header('Location: https://code.tutsplus.com/tutorials');
// Other PHP or HTML code.
?>
你必须记住在任何形式的输出之前调用header() 函数,无论是在HTML还是在PHP中。即使是空白输出也是不允许的。否则,你会得到头信息已经发送的错误。
结语
谢谢你的阅读。我希望这篇文章是学习HTTP头信息的一个好起点。