马丁传奇

导航

HTTP请求之:PHP函数header常用功能

1、页面重定向
   当浏览器接受到头信息中的 Location: http://xxxx 后,就会自动跳转到 http://xxxx 指向的URL地址,这点有点类似用 js 写跳转。但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。
   例:
   header('HTTP/1.1 301 Moved Permanently');  //声明指定当前请求的网页已永久移动到新位置(301重定向)
   header("Location: http://www.baidu.com/");  //跳转
   exit;

   当然也可以通过使用js和meta重定向
   echo "<script>window.location ='{$PHP_SELF}';</script>";
   echo "<meta http-equiv='refresh' content='0; url=index.php'>";
   exit;

2、人为指定返回客户端浏览器此次HTTP请求的(任意)状态
   当有些页面不想让用户再次访问时,可以人为制造一个无法访问的状态,并抛出异常
   例:
   header('HTTP/1.1 404 Not Found');
   header('status: 404 Not Found');
   exit;

3、指定网页的内容类型
   同样一个XML文件,如果头信息中指定:Content-type: application/xml 的话,浏览器会将其按照XML文件格式解析。但是,如果头信息中是:Content-type: text/xml 的话,浏览器就会将其看作纯文本解析。(浏览器不是按照扩展名解析文件的)
   例:
   header('Content-Type:text/html;charset=UTF-8');   //指明当前访问页面是html网页,utf8编码

4、附件下载
   不知道大家有没有注意,有些时候在一些网站下载东西,点下载连接以后,结果浏览器将这个附件当成网页打开了,里面显示的都是乱码,这个问题也和头信息有关。有时候浏览器根据Content-type 来判断是打开还是保存,这样有时就会判断错误(主要是网站设计者忘记写Content-type)。其实,还有一个可以来指定该内容为附件、需要保存,这个就是:Content-Disposition: attachment; filename="xxxxx"
   例:
   header('Content-type: application/x-msexcel');                              //指明当前访问页面文档类型
   header("Content-Disposition: attachment; filename='样本数据.xls'"); //指明当前浏览文件是附件     


 5、强制用户每次访问这个页面时获取最新资料(不是使用存在客户端的缓存)
    例:
    //告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可
    header('Expires:Mon,26 Jul 1970 05:00:00 GMT');

    //告诉浏览器此页面的最后更新日期(用格林威治时间表示)也就是当天,目的就是强迫浏览器获取最新资料
    header('Last-Modified:'.gmdate('D,d M Y H:i:s').'GMT');

    //告诉客户端浏览器不使用缓存
    header('Cache-Control: no-cache, must-revalidate');

 
获取HTTP请求的状态码函数

<?php
$url = 'http://www.baidu.com';
echo $getHTTP_CODE=getHttpCode($url);


/** 
 * 获取HTTP请求的状态码
 * @author: martinzhang
 * @param:  $url 目标URL地址
 * @return: int 返回此URL对应状态码值
 */ 
function getHttpCode($url){    
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL,$url);         //设置需要获取的URL地址,也可以在curl_init()函数中设置
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); //设置将curl_exec()获取的信息以文件流的形式返回(return),而不是直接输出。1表示return;0表示直接输出
    curl_setopt($curl,CURLOPT_TIMEOUT,3);         //设置最大超时时间,单位:秒
    curl_setopt($curl,CURLOPT_HEADER,1);         //获取Header
    curl_setopt($curl,CURLOPT_NOBODY,1);         //不需要Body内容
    curl_exec($curl);
    $getCode = curl_getinfo($curl,CURLINFO_HTTP_CODE);
    curl_close($curl);
    return $getCode;
}
?>


附:HTTP一般常见的状态码

一、【1xx 保留】

100 Continue
初始的请求已经接受,客户应当继续发送请求的其余部分

101 Switching Protocols
服务器将遵从客户的请求转换到另外一种协议

 

二、【2xx 成功处理了请求的状态码】

200 OK
服务器已成功处理了请求并提供了请求的网页

201 Created
服务器已经创建了文档,Location头给出了它的URL。

202 Accepted
已经接受请求,但处理尚未完成。

203 Non-Authoritative Information
文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝

204 No Content
服务器成功处理了请求,但没有返回任何内容。

205 Reset Content
没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容

206 Partial Content
客户发送了一个带有Range头的GET请求,服务器完成了它

 

三、【3xx 重定向 每次请求中使用重定向不要超过 5 次】

300 Multiple Choices
客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently
请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。

302 Found
类似于301,请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。

303 See Other
类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取

304 Not Modified
如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。

305 Use Proxy
客户请求的文档应该通过Location头所指明的代理服务器提取

307 Temporary Redirect
和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是 POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码: 当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。

 

四、【4xx 客户端错误 表示请求可能出错,妨碍了服务器的处理】

400 Bad Request
服务器不理解请求的语法。

401 Unauthorized
客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden
服务器拒绝请求。

404 Not Found
服务器找不到请求的网页(服务器上不存在的网页经常会返回此代码)。

405 Method Not Allowed
请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。

406 Not Acceptable
指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容

407 Proxy Authentication Required
类似于401,表示客户必须先经过代理服务器的授权。

408 Request Timeout
在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。

409 Conflict
通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。

410 Gone
请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404 代码。如果资源已永久删除,应当使用 301 指定资源的新位置。

411 Length Required
服务器不能处理请求,除非客户发送一个Content-Length头。

412 Precondition Failed
请求头中指定的一些前提条件失败

413 Request Entity Too Large
目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头

414 Request URI Too Long
URI太长

416 Requested Range Not Satisfiable
服务器不能满足客户在请求中指定的Range头

417 Expectation Failed
预期失败

 

五、【5xx 服务器错误 表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错】

500 Internal Server Error
服务器内部遇到错误,无法完成请求。

501 Not Implemented
服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求

502 Bad Gateway
服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答

503 Service Unavailable
服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。

504 Gateway Timeout
由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答

505 HTTP Version Not Supported
服务器不支持请求中所指明的HTTP版本

posted on 2013-12-10 22:00  马丁传奇  阅读(1293)  评论(0编辑  收藏  举报