一:http状态码 (200,301,302,304,305,400,401,403,404,500,501,502,503,504)
HTTP状态码(HTTP Status Code)是用以表示网页HTTP响应状态的3位数字代码。所有状态码的第一个数字代表了响应的五种状态之一。
1》消息(1字头)
这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。
100 Continue
客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应
101 Switching Protocols
服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。
只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。
2》 成功(2字头)
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受
3》重定向(3字头)
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
301 Moved Permanently
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
新的永久性的URI 应当在响应的 Location 域中返回。
302 Move temporarily
请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
304 Not Modified
4》 请求错误(4字头)
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理
400 Bad Request
$string
[, bool $replace
= true [, int $http_response_code
]] ) string
头字符串。 有两种特别的头。第一种以“ HTTP/”开头的 (case is not significant),将会被用来计算出将要发送的HTTP状态码。 例如在 Apache 服务器上用 PHP 脚本来处理不存在文件的请求(使用 ErrorDocument 指令), 就会希望脚本响应了正确的状态码。 header("HTTP/1.0 404 Not Found");
第二种特殊情况是“Location:”的头信息。它不仅把报文发送给浏览器,而且还将返回给浏览器一个 REDIRECT(302)的状态码,除非状态码已经事先被设置为了 201或者 3xx。 header("Location: http://www.example.com/"); /* Redirect browser */
HTTP状态信息的报文永远都是最新被发送到客户端的,而不管header()是否是在最先发送的。报文状态码可能会被重写,当调用header()来设定新的状态码,除非HTTP报文已经被发送了 I strongly recommend, that you use header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); instead of header("HTTP/1.1 404 Not Found");
案例: 1》下载对话框 如果你想提醒用户去保存你发送的数据,例如保存一个生成的PDF文件。你可以使用 的报文信息来提供一个推荐的文件名,并且强制浏览器显示一个文件下载的对话框。 // We'll be outputting a PDFheader('Content-type: application/pdf');// It will be called downloaded.pdfheader('Content-Disposition: attachment; filename="downloaded.pdf"');// The PDF source is in original.pdfreadfile('original.pdf');
der("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
也许你会遇到这样的情况,那就是即使你没使用上面这段代码,你的页面也没有被缓存。大多数情况是因为用户可以自己设置他们的浏览器从而改变浏览器默认的缓存行为。一旦发送了上面这段报文信息,那么你就应该重写那些可能用到缓存了的代码。
此外,在启用session的情况下,和session.cache_limiter的配置可以用来自动地生成正确的缓存相关的头信息。
// 301 Moved Permanentlyheader("Location: /foo.php",TRUE,301);// 302 Foundheader("Location: /foo.php",TRUE,302);header("Location: /foo.php");// 303 See Otherheader("Location: /foo.php",TRUE,303);// 307 Temporary Redirectheader("Location: /foo.php",TRUE,307);