HTTP请求头字段介绍
HTTP请求头字段是客户端发送给服务器的一些附加信息,用来描述请求的内容、格式、来源、目标等。请求头字段可以分为标准和非标准两种,标准的请求头字段由IETF或者W3C等组织定义,遵循HTTP协议的规范,非标准的请求头字段则是由一些浏览器、框架或者应用程序自定义,没有统一的规范,但是在实际使用中也很常见。本文将介绍一些常用的标准和非标准请求头字段,以及它们的含义和用法。
常用标准请求头字段
-
Accept: 设置接受的内容类型,例如
Accept: text/plain
表示只接受纯文本格式的响应。 -
Accept-Charset: 设置接受的字符编码,例如
Accept-Charset: utf-8
表示只接受UTF-8编码的响应。 -
Accept-Encoding: 设置接受的编码格式,例如
Accept-Encoding: gzip, deflate
表示可以接受gzip或者deflate压缩的响应。 -
Accept-Datetime: 设置接受的版本时间,例如
Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT
表示只接受在这个时间之前修改过的资源。 -
Accept-Language: 设置接受的语言,例如
Accept-Language: en-US
表示只接受美式英语的响应。 -
Authorization: 设置HTTP身份验证的凭证,例如
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
表示使用基本认证方式,并且用户名和密码经过Base64编码。 -
Cache-Control: 设置请求响应链上所有的缓存机制必须遵守的指令,例如
Cache-Control: no-cache
表示不使用任何缓存。 -
Connection: 设置当前连接和hop-by-hop协议请求字段列表的控制选项,例如
Connection: keep-alive
表示保持连接不断开,Connection: Upgrade
表示请求升级协议。 -
Content-Length: 设置请求体的字节长度,例如
Content-Length: 348
表示请求体有348个字节。 -
Content-MD5: 设置基于MD5算法对请求体内容进行Base64二进制编码,例如
Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
表示请求体内容经过MD5加密后再进行Base64编码。 -
Content-Type: 设置请求体的MIME类型(适用POST和PUT请求),例如
Content-Type: application/x-www-form-urlencoded
表示请求体是表单数据格式。 -
Cookie: 设置服务器使用Set-Cookie发送的http cookie,例如
Cookie: $Version=1; Skin=new;
表示发送了两个cookie,一个是版本号为1,一个是皮肤为new。 -
Date: 设置消息发送的日期和时间,例如
Date: Tue, 15 Nov 1994 08:12:31 GMT
表示消息发送于1994年11月15日格林威治时间8点12分31秒。 -
Expect: 标识客户端需要的特殊浏览器行为,例如
Expect: 100-continue
表示客户端希望服务器先返回一个100状态码,然后再发送请求体。 -
Forwarded: 披露客户端通过http代理连接web服务的源信息,例如
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
表示客户端IP地址是192.0.2.60,使用http协议,通过代理IP地址是203.0.113.43连接服务器。也可以使用多个for参数,例如Forwarded: for=192.0.2.43, for=198.51.100.17
表示客户端经过了两个代理。 -
From: 设置发送请求的用户的email地址,例如
From: user@example.com
表示请求来自user@example.com的用户。 -
Host: 设置服务器域名和TCP端口号,如果使用的是服务请求标准端口号,端口号可以省略,例如
Host: en.wikipedia.org:8080
表示请求的服务器域名是en.wikipedia.org,端口号是8080,Host: en.wikipedia.org
表示请求的服务器域名是en.wikipedia.org,端口号是默认的80。 -
If-Match: 设置客户端的ETag,当时客户端ETag和服务器生成的ETag一致才执行,适用于更新自从上次更新之后没有改变的资源,例如
If-Match: "737060cd8c284d8af7ad3082f209582d"
表示只有当资源的ETag和这个值相同才执行更新操作。 -
If-Modified-Since: 设置更新时间,从更新时间到服务端接受请求这段时间内如果资源没有改变,允许服务端返回304 Not Modified,例如
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
表示只有当资源在1994年10月29日格林威治时间19点43分31秒之后没有修改过才返回304状态码。 -
If-None-Match: 设置客户端ETag,如果和服务端接受请求生成的ETage相同,允许服务端返回304 Not Modified,例如
If-None-Match: "737060cd8c284d8af7ad3082f209582d"
表示只有当资源的ETag和这个值不同才返回正常响应。 -
If-Range: 设置客户端ETag,如果和服务端接受请求生成的ETage相同,返回缺失的实体部分;否则返回整个新的实体,例如
If-Range: "737060cd8c284d8af7ad3082f209582d"
表示如果资源的ETag和这个值相同,就返回之前请求过的部分实体;否则返回整个新的实体。 -
If-Unmodified-Since: 设置更新时间,只有从更新时间到服务端接受请求这段时间内实体没有改变,服务端才会发送响应,例如
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
表示只有当资源在1994年10月29日格林威治时间19点43分31秒之后没有修改过才发送响应。 -
Max-Forwards: 限制代理或网关转发消息的次数,例如
Max-Forwards: 10
表示消息最多可以被转发10次。 -
Origin: 标识跨域资源请求(请求服务端设置Access-Control-Allow-Origin响应字段),例如
Origin: http://www.example-social-network.com
表示请求来自www.example-social-network.com这个域名。 -
Pragma: 设置特殊实现字段,可能会对请求响应链有多种影响,例如
Pragma: no-cache
表示不使用任何缓存。 -
Proxy-Authorization: 为连接代理授权认证信息,例如
Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
表示使用基本认证方式,并且用户名和密码经过Base64编码。 -
Range: 请求部分实体,设置请求实体的字节数范围,具体可以参见HTTP/1.1中的Byte serving,例如
Range: bytes=500-999
表示请求第500到第999个字节的内容。 -
Referer: 设置前一个页面的地址,并且前一个页面中的连接指向当前请求,意思就是如果当前请求是在A页面中发送的,那么referer就是A页面的url地址(轶事:这个单词正确的拼法应该是"referrer",但是在很多规范中都拼成了"referer",所以这个单词也就成为标准用法),例如
Referer: http://en.wikipedia.org/wiki/Main_Page
表示请求来自维基百科的主页。 -
TE: 设置用户代理期望接受的传输编码格式,和响应头中的Transfer-Encoding字段一样,例如
TE: trailers, deflate
表示可以接受trailers和deflate两种传输编码格式。 -
Upgrade: 请求服务端升级协议,例如
Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocket
表示请求升级到HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11或者websocket协议。 -
User-Agent: 用户代理的字符串值,用来标识客户端的类型、版本、操作系统等信息,例如
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0
表示使用Mozilla 5.0浏览器,运行在Linux x86_64系统上,使用Gecko引擎,版本是Firefox 21.0。 -
Via: 通知服务器代理请求,用来追踪请求的路径,例如
Via: 1.0 fred, 1.1 example.com (Apache/1.1)
表示请求经过了fred这个代理(使用HTTP/1.0协议),然后经过了example.com这个代理(使用Apache/1.1服务器)。 -
Warning: 实体可能会发生的问题的通用警告,例如
Warning: 199 Miscellaneous warning
表示有一个未分类的警告。
常用非标准请求头字段
- X-Requested-With: 标识Ajax请求,大部分js框架发送请求时都会设置它为XMLHttpRequest,例如
X-Requested-With: XMLHttpRequest
表示这是一个Ajax请求。 - DNT: 请求web应用禁用用户追踪,例如
DNT: 1 (Do Not Track Enabled)
表示不要追踪用户的行为,DNT: 0 (Do Not Track Disabled)
表示可以追踪用户的行为。 - X-Forwarded-For: 一个事实标准,用来标识客户端通过HTTP代理或者负载均衡器连接的web服务器的原始IP地址,例如
X-Forwarded-For: client1, proxy1, proxy2
表示客户端IP地址是client1,经过了proxy1和proxy2两个代理。 - X-Forwarded-Host: 一个事实标准,用来标识客户端在HTTP请求头中请求的原始host,因为主机名或者反向代理的端口可能与处理请求的原始服务器不同,例如
X-Forwarded-Host: en.wikipedia.org:8080
表示客户端请求的host是en.wikipedia.org:8080。 - X-Forwarded-Proto: 一个事实标准,用来标识HTTP原始协议,因为反向代理或者负载均衡器和web服务器可能使用http,但是请求到反向代理使用的是https,例如
X-Forwarded-Proto: https
表示客户端使用https协议连接反向代理。 - Front-End-Https: 微软应用程序和负载均衡器使用的非标准header字段,用来标识客户端是否使用https协议连接反向代理或者负载均衡器,例如
Front-End-Https: on
表示客户端使用https协议。 - X-Http-Method-Override: 请求web应用时,使用header字段中给定的方法(通常是put或者delete)覆盖请求中指定的方法(通常是post),如果用户代理或者防火墙不支持直接使用put或者delete方法发送请求时,可以使用这个字段,例如
X-HTTP-Method-Override: DELETE
表示使用DELETE方法替换POST方法。 - X-ATT-DeviceId: 允许更简单的解析用户代理在AT&T设备上的MakeModel/Firmware,例如
X-Att-Deviceid: GT-P7320/P7320XXLPG
表示用户代理使用的是GT-P7320设备,固件版本是P7320XXLPG。 - X-Wap-Profile: 设置描述当前连接设备的详细信息的xml文件在网络中的位置,例如
x-wap-profile: http://wap.samsungmobile.com/uaprof/SGH-I777.xml
表示用户代理使用的设备的信息可以在这个xml文件中查看。 - Proxy-Connection: 早起HTTP版本中的一个误称,现在使用标准的connection字段,例如
Proxy-Connection: keep-alive
表示保持连接不断开。 - X-UIDH: 服务端深度包检测插入的一个唯一ID标识Verizon Wireless的客户,例如
X-UIDH: ...
表示客户端是Verizon Wireless的用户,并且有一个唯一的ID。 - X-Csrf-Token,X-CSRFToken,X-XSRF-TOKEN: 防止跨站请求伪造,用来验证请求是否来自合法的源,例如
X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
表示请求携带了一个csrf令牌,服务端可以根据这个令牌判断请求是否有效。 - X-Request-ID,X-Correlation-ID: 标识客户端和服务端的HTTP请求,用来追踪和调试请求,例如
X-Request-ID: f05
表示请求有一个唯一的ID为f05。
总结
本文介绍了一些常用的标准和非标准请求头字段,以及它们的含义和用法。请求头字段可以帮助客户端和服务端之间进行更好的沟通和协商,提高请求的效率和安全性。当然,还有很多其他的请求头字段没有涉及到,如果你想了解更多,请参考以下网址: