收藏 分享(赏)

什么是 HTTP Headers.doc

上传人:scg750829 文档编号:9060152 上传时间:2019-07-22 格式:DOC 页数:20 大小:444KB
下载 相关 举报
什么是 HTTP Headers.doc_第1页
第1页 / 共20页
什么是 HTTP Headers.doc_第2页
第2页 / 共20页
什么是 HTTP Headers.doc_第3页
第3页 / 共20页
什么是 HTTP Headers.doc_第4页
第4页 / 共20页
什么是 HTTP Headers.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、什么是 HTTP Headers?作者: GuYoung 来源: 博客园 发布时间: 2012-06-05 21:27 什么是 HTTP HeadersHTTP 是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过 http 协议来传输的,比如这篇文章。HTTP Headers 是 HTTP 请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。示例当你在浏览器地址栏里键入一个 url,你的浏览器将会类似如下的 http 请求:GET /tutorials/other/top-20-mysq

2、l-best-practices/ HTTP/1.1Host: 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.8Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset:

3、ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveCookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120Pragma: no-cacheCache-Control: no-cache第一行被称为“Request Line” 它描述的是这个请求的基本信息,剩下的就是 HTTP headers 了。请求完成之后,你的浏览器可能会收到如下的 HTTP 响应:HTTP/1.x 200 OKTransfer-Encoding: chunkedDate: Sat, 28 Nov 2009

4、04:36:25 GMTServer: LiteSpeedConnection: closeX-Powered-By: W3 Total Cache/0.8Pragma: publicExpires: Sat, 28 Nov 2009 05:36:25 GMTEtag: “pub1259380237;gz“Cache-Control: max-age=3600, publicContent-Type: text/html; charset=UTF-8Last-Modified: Sat, 28 Nov 2009 03:50:37 GMTX-Pingback: http:/ gzipVary:

5、Accept-Encoding, Cookie, User-Agent第一行呢被称为“Status Line”,它之后就是 http headers,空行完了就开始输出内容了(在这个案例中是一些 html 输出)。但你查看页面源代码却不能看到 HTTP headers,虽然它们同你能看到的东西一起被传送至浏览器了。这个 HTTP 请求也发出了一些其它资源的接收请求,例如图片,css 文件,js 文件等等。下面我们来看看细节。怎样才能看到 HTTP Headers下面这些 FireFox 扩展能够帮助你分析 HTTP headers:1. Firebug2. Live HTTP Headers3

6、. 在 PHP 中:getallheaders() 用来获取请求头部 . 你也可以使用 $_SERVER 数组.headers_list() 用来获取响应头部 .文章下面将会看到一些使用 php 示范的例子。HTTP Request 的结构被称作“first line”的第一行包含三个部分:“method” 表明这是何种类型的请求 . 最常见的请求类型有 GET, POST 和 HEAD.“path” 体现的是主机之后的路径. 例如,当你请求 “http:/ , path 就会是 “/tutorials/other/top-20-mysql-best-practices/”.“protocol

7、” 包含有 “HTTP” 和版本号, 现代浏览器都会使用 1.1.剩下的部分每行都是一个“Name:Value”对。它们包含了各式各样关于请求和你浏览器的信息。例如”User-Agent“就表明了你的浏览器版本和你所用的操作系统。”Accept-Encoding“会告诉服务器你的浏览可以接受类似 gzip 的压缩输出。这些 headers 大部分都是可选的。 HTTP 请求甚至可以被精简成这样子:GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1Host: 并且你仍旧可以从服务器收到有效的响应。请求类型三种最常见的请求类型是:G

8、ET,POST 和 HEAD ,从 html 的编写过程中你可能已经熟悉了前两种。GET:获取一个文档大部分被传输到浏览器的 html, images, js, css, 都是通过 GET 方法发出请求的。它是获取数据的主要方法。例如,要获取 Nettuts+ 的文章,http request 的第一行通常看起来是这样的:GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1一旦 html 加载完成,浏览器将会发送 GET 请求去获取图片,就像下面这样:GET /wp-content/themes/tuts_theme/images

9、/header_bg_tall.png HTTP/1.1表单也可以通过 GET 方法发送,下面是个例子:First Name: Last Name: 当这个表单被提交时,HTTP request 就会像这样:GET /foo.php?first_name=John 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.8Accept-La

10、nguage: en-us,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-aliveReferer: http:/localhost/test.phpContent-Type: application/x-www-form-urlencodedContent-Length: 43first_name=John U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102

11、 Firefox/3.5.5 (.NET CLR 3.5.30729)这个头部可以携带如下几条信息:浏览器名和版本号.操作系统名和版本号.默认语言.这就是某些网站用来收集访客信息的一般手段。例如,你可以判断访客是否在使用手机访问你的网站,然后决定是否将他们引导至一个在低分辨率下表现良好的移动网站。在 PHP 中,可以通过 $_SERVERHTTP_USER_AGENT 来获取 User-Agentif ( strstr($_SERVERHTTP_USER_AGENT,MSIE 6) ) echo “Please stop using IE6!“;Accept-LanguageAccept-La

12、nguage: en-us,en;q=0.5这个信息可以说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。它可以通过逗号分割来携带多国语言。第一个会是首选的语言,其它语言会携带一个“q”值,来表示用户对该语言的喜好程度(01)。在 PHP 中用 $_SERVER“HTTP_ACCEPT_LANGUAGE“ 来获取这一信息。if (substr($_SERVERHTTP_ACCEPT_LANGUAGE, 0, 2) = fr) header(Location: http:/);Accept-EncodingAccept-Encoding: gzip,d

13、eflate大部分的现代浏览器都支持 gzip 压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的 HTML 发送给浏览器。这可以减少近 80%的文件大小,以节省下载时间和带宽。在 PHP 中可以使用 $_SERVER“HTTP_ACCEPT_ENCODING“ 获取该信息。 然后调用 ob_gzhandler()方法时会自动检测该值,所以你无需手动检测。/ enables output buffering/ and all output is compressed if the browser supports itob_start(ob_gzhandler);If-Modified-

14、Since如果一个页面已经在你的浏览器中被缓存,那么你下次浏览时浏览器将会检测文档是否被修改过,那么它就会发送这样的头部:If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT如果自从这个时间以来未被修改过,那么服务器将会返回“304 Not Modified”,而且不会再返回内容。浏览器将自动去缓存中读取内容在 PHP 中,可以用$_SERVERHTTP_IF_MODIFIED_SINCE 来检测。/ assume $last_modify_time was the last the output was updated/ did the brows

15、er send If-Modified-Since header?if(isset($_SERVERHTTP_IF_MODIFIED_SINCE) / if the browser cache matches the modify timeif ($last_modify_time = strtotime($_SERVERHTTP_IF_MODIFIED_SINCE) / send a 304 header, and no contentheader(“HTTP/1.1 304 Not Modified“);exit;还有一个叫 Etag 的 HTTP 头信息,它被用来确定缓存的信息是否正确,

16、稍后我们将会解释它。Cookie顾名思义,他会发送你浏览器中存储的 Cookie 信息给服务器。Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar它是用分号分割的一组名值对。Cookie 也可以包含 session id。在 PHP 中,单一的 Cookie 可以访问$_COOKIE 数组获得。你可以直接用$_SESSION array 获取 session 变量。如果你需要 session id,那么你可以使用session_id()函数代替 cookie。echo $_COOKIEfoo;/ output: barecho $_COO

17、KIEPHPSESSID;/ output: r2t5uvjq435r4q7ib3vtdjq120session_start();echo session_id();/ output: r2t5uvjq435r4q7ib3vtdjq120Referer顾名思义, 头部将会包含 referring url 信息。例如,我访问 Nettuts+的主页并点击了一个链接,这个头部信息将会发送到浏览器:Referer: http:/ 在 PHP 中,可以通过 $_SERVERHTTP_REFERER 获取该值。if (isset($_SERVERHTTP_REFERER) $url_info = par

18、se_url($_SERVERHTTP_REFERER);/ is the surfer coming from Google?if ($url_infohost = ) parse_str($url_infoquery, $vars);echo “You searched on Google for this keyword: “. $varsq;/ if the referring url was:/ http:/ charset=UTF-8text 是文档类型, html则是文档子类型。 这个头部还包括了更多信息,例如 charset。如果是一个图片,将会发送这样的响应:Content-

19、Type: image/gif浏览器可以通过 mime-type 来决定使用外部程序还是自身扩展来打开该文档。如下的例子降调用 Adobe Reader:Content-Type: application/pdf直接载入,Apache 通常会自动判断文档的 mime-type 并且添加合适的信息到头部去。并且大部分浏览器都有一定程度的容错,在头部未提供或者错误提供该信息的情况下它会去自动检测 mime-type。你可以在这里找到一个常用 mime-type 列表。在 PHP 中你可以通过 finfo_file() 来检测文件的 ime-type。Content-Disposition这个头部信

20、息将告诉浏览器打开一个文件下载窗口,而不是试图解析该响应的内容。例如:Content-Disposition: attachment; filename=“download.zip“他会导致浏览器出现这样的对话框:注意,适合它的 Content-Type 头信息同时也会被发送Content-Type: application/zipContent-Disposition: attachment; filename=“download.zip“Content-Length当内容将要被传输到浏览器时,服务器可以通过该头部告知浏览器将要传送文件的大小(bytes)。Content-Length: 8

21、9123对于文件下载来说这个信息相当的有用。这就是为什么浏览器知道下载进度的原因。例如,这里我写了一段虚拟脚本,来模拟一个慢速下载。/ its a zip fileheader(Content-Type: application/zip);/ 1 million bytes (about 1megabyte)header(Content-Length: 1000000);/ load a download dialogue, and save it as download.zipheader(Content-Disposition: attachment; filename=“download.zip“);/ 1000 times 1000 bytes of datafor ($i = 0; $i Hello $_SERVERPHP_AUTH_USER.“;echo “You entered $_SERVERPHP_AUTH_PW as your password.“;Content-Encoding这个头部通常会在返回内容被压缩时设置。Content-Encoding: gzip在 PHP 中,如果你调用了 ob_gzhandler()函数,这个头部将会自动被设置。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报