http请求头

197 阅读10分钟

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。

总结

本文介绍了一些常用的标准和非标准请求头字段,以及它们的含义和用法。请求头字段可以帮助客户端和服务端之间进行更好的沟通和协商,提高请求的效率和安全性。当然,还有很多其他的请求头字段没有涉及到,如果你想了解更多,请参考以下网址:

developer.mozilla.org/zh-CN/docs/…