状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response。
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
PHP在响应报文中添加状态码示例:
    <?php
    public function response_code(){
        http_code(303);
    }
    function http_code($num){
        $http = array (
            100 => "HTTP/1.1 100 Continue",
            101 => "HTTP/1.1 101 Switching Protocols",
            200 => "HTTP/1.1 200 OK",
            201 => "HTTP/1.1 201 Created",
            202 => "HTTP/1.1 202 Accepted",
            203 => "HTTP/1.1 203 Non-Authoritative Information",
            204 => "HTTP/1.1 204 No Content",
            205 => "HTTP/1.1 205 Reset Content",
            206 => "HTTP/1.1 206 Partial Content",
            300 => "HTTP/1.1 300 Multiple Choices",
            301 => "HTTP/1.1 301 Moved Permanently",
            302 => "HTTP/1.1 302 Found",
            303 => "HTTP/1.1 303 See Other",
            304 => "HTTP/1.1 304 Not Modified",
            305 => "HTTP/1.1 305 Use Proxy",
            307 => "HTTP/1.1 307 Temporary Redirect",
            400 => "HTTP/1.1 400 Bad Request",
            401 => "HTTP/1.1 401 Unauthorized",
            402 => "HTTP/1.1 402 Payment Required",
            403 => "HTTP/1.1 403 Forbidden",
            404 => "HTTP/1.1 404 Not Found",
            405 => "HTTP/1.1 405 Method Not Allowed",
            406 => "HTTP/1.1 406 Not Acceptable",
            407 => "HTTP/1.1 407 Proxy Authentication Required",
            408 => "HTTP/1.1 408 Request Time-out",
            409 => "HTTP/1.1 409 Conflict",
            410 => "HTTP/1.1 410 Gone",
            411 => "HTTP/1.1 411 Length Required",
            412 => "HTTP/1.1 412 Precondition Failed",
            413 => "HTTP/1.1 413 Request Entity Too Large",
            414 => "HTTP/1.1 414 Request-URI Too Large",
            415 => "HTTP/1.1 415 Unsupported Media Type",
            416 => "HTTP/1.1 416 Requested range not satisfiable",
            417 => "HTTP/1.1 417 Expectation Failed",
            500 => "HTTP/1.1 500 Internal Server Error",
            501 => "HTTP/1.1 501 Not Implemented",
            502 => "HTTP/1.1 502 Bad Gateway",
            503 => "HTTP/1.1 503 Service Unavailable",
            504 => "HTTP/1.1 504 Gateway Time-out"
        );
        header($http[$num]);
    }
    ?>
HTTP Response Header包含以下内容:
作用:生成消息的具体时间和日期
例如:Date: Sat, 11 Feb 2012 11:35:14 GMT
作用:浏览器会在指定过期时间内使用本地缓存
例如:Expires: Tue, 08 Feb 2022 11:35:14 GMT
作用:
例如:Vary: Accept-Encoding
作用:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
例如:P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
作用:非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.
例如:Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
作用:和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)
例如:ETag: “03f2b33c0bfcc1:0”
作用:用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)
例如:Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,
例如: 
Content-Type: text/html; charset=utf-8 
Content-Type:text/html;charset=GB2312 
Content-Type: image/jpeg
作用: 指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。 
需要说明的是,Content-Length由response 报文 body实际长度确定。 
例如:Content-Length: 19847
作用: WEB服务器告诉浏览器自己响应的对象的语言者 
例如: Content-Language:da
作用:指明HTTP服务器的软件信息,内容由实际服务器确定 
例如:Server: Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.6.8
作用:表示网站是用什么技术开发的 
例如:X-Powered-By: PHP/5.6.8
例如:Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
例如:Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。 
例如:Content-Encoding:gzip
作用: 用于重定向一个新的位置, 包含新的URL地址
PHP 发送 Response报文就要简单多了,如下片段所示:
//发送Response Header
header("Content-Type:image/jpeg");
//发送Response body
echo "body 内容";
#附:HTTP header 详解
Requests部分
| Header | 解释 | 示例 | 
|---|---|---|
| Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html | 
| Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 | 
| Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip | 
| Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh | 
| Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes | 
| Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | 
| Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache | 
| Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close | 
| Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; | 
| Content-Length | 请求的内容长度 | Content-Length: 348 | 
| Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded | 
| Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT | 
| Expect | 请求的特定的服务器行为 | Expect: 100-continue | 
| From | 发出请求的用户的Email | From: user@email.com | 
| Host | 指定请求的服务器的域名和端口号 | Host: www.zcmhi.com | 
| If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” | 
| If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT | 
| If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” | 
| If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” | 
| If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT | 
| Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 | 
| Pragma | 用来包含实现特定的指令 | Pragma: no-cache | 
| Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | 
| Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 | 
| Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives/71.html | 
| TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 | 
| Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 | 
| User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) | 
| Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) | 
| Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning | 
| Header | 解释 | 示例 | 
|---|---|---|
| Accept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的分段请求 | Accept-Ranges: bytes | 
| Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12 | 
| Allow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD | 
| Cache-Control | 告诉所有的缓存机制是否可以缓存及哪种类型 | Cache-Control: no-cache | 
| Content-Encoding | web服务器支持的返回内容压缩编码类型。 | Content-Encoding: gzip | 
| Content-Language | 响应体的语言 | Content-Language: en,zh | 
| Content-Length | 响应体的长度 | Content-Length: 348 | 
| Content-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm | 
| Content-MD5 | 返回资源的MD5校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== | 
| Content-Range | 在整个返回体中本部分的字节位置 | Content-Range: bytes 21010-47021/47022 | 
| Content-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8 | 
| Date | 原始服务器消息发出的时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT | 
| ETag | 请求变量的实体标签的当前值 | ETag: “737060cd8c284d8af7ad3082f209582d” | 
| Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT | 
| Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT | 
| Location | 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 | Location: http://www.zcmhi.com/archives/94.html | 
| Pragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache | 
| Proxy-Authenticate | 它指出认证方案和可应用到代理的该URL上的参数 | Proxy-Authenticate: Basic | 
| refresh | 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) | 
 
 Refresh: 5; url= 
http://www.zcmhi.com/archives/94.html 
 | 
| Retry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 | Retry-After: 120 | 
| Server | web服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) | 
| Set-Cookie | 设置Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 | 
| Trailer | 指出头域在分块传输编码的尾部存在 | Trailer: Max-Forwards | 
| Transfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked | 
| Vary | 告诉下游代理是使用缓存响应还是从原始服务器请求 | Vary: * | 
| Via | 告知代理客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) | 
| Warning | 警告实体可能存在的问题 | Warning: 199 Miscellaneous warning | 
| WWW-Authenticate | 表明客户端请求实体应该使用的授权方案 | WWW-Authenticate: Basic | 
//定义编码 header( ‘Content-Type:text/html;charset=utf-8 ‘); //Atom header(‘Content-type: application/atom+xml‘); //CSS header(‘Content-type: text/css‘); //Javascript header(‘Content-type: text/javascript‘); //JPEG Image header(‘Content-type: image/jpeg‘); //JSON header(‘Content-type: application/json‘); //PDF header(‘Content-type: application/pdf‘); //RSS header(‘Content-Type: application/rss+xml; charset=ISO-8859-1‘); //Text (Plain) header(‘Content-type: text/plain‘); //XML header(‘Content-type: text/xml‘); //200 OK header(‘HTTP/1.1 200 OK‘); //设置一个404头: header(‘HTTP/1.1 404 Not Found‘); //设置地址被永久的重定向 header(‘HTTP/1.1 301 Moved Permanently‘); //转到一个新地址 header(‘Location: http://www.example.org/‘); //文件延迟转向: header(‘Refresh: 10; url=http://www.example.org/‘); print ‘You will be redirected in 10 seconds‘; //当然,也可以使用html语法实现 //<meta http-equiv="refresh" content="10;http://www.example.org/ /> //override X-Powered-By: PHP: header(‘X-Powered-By: PHP/4.4.0‘); header(‘X-Powered-By: Brain/0.6b‘); //文档语言 header(‘Content-language: en‘); //告诉浏览器最后一次修改时间 $time = time() - 60; // or filemtime($fn), etc header(‘Last-Modified: ‘.gmdate(‘D, d M Y H:i:s‘, $time).‘ GMT‘); //告诉浏览器文档内容没有发生改变 header(‘HTTP/1.1 304 Not Modified‘); //设置内容长度 header(‘Content-Length: 1234‘); //设置为一个下载类型 header(‘Content-Type: application/octet-stream‘); header(‘Content-Disposition: attachment; filename="example.zip"‘); header(‘Content-Transfer-Encoding: binary‘); //load the file to send: readfile(‘example.zip‘); //对当前文档禁用缓存 header(‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate‘); header(‘Expires: Mon, 26 Jul 1997 05:00:00 GMT‘); // Date in the past header(‘Pragma: no-cache‘); //设置内容类型: header(‘Content-Type: text/html; charset=iso-8859-1‘); header(‘Content-Type: text/html; charset=utf-8‘); header(‘Content-Type: text/plain‘); //纯文本格式 header(‘Content-Type: image/jpeg‘); //JPG*** header(‘Content-Type: application/zip‘); // ZIP文件 header(‘Content-Type: application/pdf‘); // PDF文件 header(‘Content-Type: audio/mpeg‘); // 音频文件 header(‘Content-Type: application/x-shockw**e-flash‘); //Flash动画 //显示登陆对话框 header(‘HTTP/1.1 401 Unauthorized‘); header(‘WWW-Authenticate: Basic realm="Top Secret"‘); print ‘Text that will be displayed if the user hits cancel or ‘; print ‘enters wrong login data‘;
// 调用请求函数
publicfunction test(){ $chost =‘test‘; $cpath =‘http://www.cleey.com‘; $crequest =‘‘; $rel = $this->http_post($crequest, $chost, $cpath,80); var_dump($rel);}// 模拟http post请求function http_post($request, $host, $path, $port){ $strlen = strlen($request); $http_request ="POST $path HTTP/1.0\r\n"; $http_request .="Accept-Encoding: gzip,deflate\r\n"; $http_request .="Content-Type: application/json;charset=UTF-8\r\n"; $http_request .="User-Agent: Jakarta Commons-HttpClient/3.1\r\n"; $http_request .="Host: www.cleey.com\r\n"; $http_request .="Content-Length: $strlen\r\n";// $http_request .= "Token: wwwww\r\n"; $http_request .="\r\n"; $http_request .= $request; $response =‘‘;if(false!=( $fs =@fsockopen( $host, $port, $errno, $errstr,10))){ fwrite( $fs, $http_request );while(!feof( $fs )) $response .= fgets( $fs,1160);// One TCP-IP packet fclose( $fs ); $response = explode("\r\n\r\n", $response,2);}return $response;}
原文:http://www.cnblogs.com/zx-admin/p/6172029.html