打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
了解HTTP Headers的方方面面(4)

 


HTTP Headers 中的 HTTP请求


现在我们来看一些在HTTP headers中常见的HTTP请求信息。


所有这些头部信息都可以在PHP的$_SERVER数组中找到。你也可以用getallheaders() 函数一次性获取所有的头部信息。


Host


一个HTTP请求会发送至一个特定的IP地址,但是大部分服务器都有在同一IP地址下托管多个网站的能力,那么服务器必须知道浏览器请求的是哪个域名下的资源。


Host: rlog.cn


这只是基本的主机名,包含域名和子级域名。


在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'] 来获取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压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。


在PHP中可以使用 $_SERVER["HTTP_ACCEPT_ENCODING"] 获取该信息。 然后调用ob_gzhandler()方法时会自动检测该值,所以你无需手动检测。


// 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


顾名思义,他会发送你浏览器中存储的Cookie信息给服务器。


Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar


它是用分号分割的一组名值对。Cookie也可以包含session id。


在PHP中,单一的Cookie可以访问$_COOKIE数组获得。你可以直接用$_SESSION array获取session变量。如果你需要session id,那么你可以使用session_id()函数代替cookie。


echo $_COOKIE['foo'];

// output: bar

echo $_COOKIE['PHPSESSID'];

// output: r2t5uvjq435r4q7ib3vtdjq120

session_start();

echo session_id();

// output: r2t5uvjq435r4q7ib3vtdjq120


Referer


顾名思义, 头部将会包含referring url信息。


例如,我访问Nettuts+的主页并点击了一个链接,这个头部信息将会发送到浏览器:

Referer: http://net.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


You may have noticed the word “referrer” is misspelled as “referer”. Unfortunately it made into the official HTTP specifications like that and got stuck.


Authorization


当一个页面需要授权,浏览器就会弹出一个登陆窗口,输入正确的账号后,浏览器会发送一个HTTP请求,但此时会包含这样一个头部:


Authorization: Basic bXl1c2VyOm15cGFzcw==


包含在头部的这部分信息是base64 encoded。例如,base64_decode(‘bXl1c2VyOm15cGFzcw==’) 会被转化为 ‘myuser:mypass’ 。


在PHP中,这个值可以用$_SERVER['PHP_AUTH_USER'] 和 $_SERVER['PHP_AUTH_PW'] 获得。


更多细节我们会在WWW-Authenticate部分讲解。



               
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
HTTP Headers 入门
浅析http协议与缓存
关于解决浏览器不同域名交互数据的跨域问题(php和vue)
网络基本原理概述-翻译(part-3)
session与cookie
用 PHP 获得浏览器信息?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服