HTTP状态码和编程
一 HTTP狀態碼
狀態碼 
 消息 
 描述
 ?
 100 
 Continue 
 只有一部分請求被服務器接收,但只要沒被服務器拒絕,客戶端就會延續這個請求
 ?
 101 
 Switching Protocols 
 服務器交換機協議
 ?
 200 
 OK 
 請求被確認
 ?
 201 
 Created 
 請求時完整的,新的資源被創建
 ?
 202 
 Accepted 
 請求被接受,但未處理完
 ?
 203 
 Non-authoritative Information
 ?
 204 
 No Content
 ?
 205 
 Reset Content
 ?
 206
 Partial Content
 ?
 300 
 Multiple Choices 
 一個超鏈接表,用戶可以選擇一個超鏈接并訪問,最大支持5個超鏈接
 ?
 301 
 Moved Permanently 
 被請求的頁面已經移動到了新的URL下
 ?
 302 
 Found 
 被請求的頁面暫時性地移動到了新的URL下
 ?
 303 
 See Other 
 被請求的頁面可以在一個不同的URL下找到
 ?
 304 
 Not Modified
 ?
 305 
 Use Proxy
 ?
 306 
 Unused 
 已經不再使用此狀態碼,但狀態碼被保留
 ?
 307 
 Temporary Redirect 
 被請求的頁面暫時性地移動到了新的URL下
 ?
 400 
 Bad Request 
 服務器無法識別請求
 ?
 401 
 Unauthorized 
 被請求的頁面需要用戶名和密碼
 ?
 402 
 Payment Required 
 目前還不能使用此狀態碼
 ?
 403 
 Forbidden 
 禁止訪問所請求的頁面
 ?
 404 
 Not Found 
 服務器無法找到所請求的頁面
 ?
 405 
 Method Not Allowed 
 請求中所指定的方法不被允許
 ?
 406 
 Not Acceptable 
 服務器只能創建一個客戶端無法接受的響應
 ?
 407 
 Proxy Authentication Required 
 在請求被服務前必須認證一個代理服務器
 ?
 408 
 Request Timeout 
 請求時間超過了服務器所能等待的時間,連接被斷開
 ?
 409 
 Conflict 
 請求有矛盾的地方
 ?
 410
 Gone 
 被請求的頁面不再可用
 ?
 411 
 Length Required 
 "Content-Length"沒有被定義,服務器拒絕接受請求
 ?
 412 
 Precondition Failed 
 請求的前提條件被服務器評估為false
 ?
 413 
 Request Entity Too Large 
 因為請求的實體太大,服務器拒絕接受請求
 ?
 414 
 Request-url Too Long 
 服務器拒絕接受請求,因為URL太長。多出現在把"POST"請求轉換為"GET"請求時所附帶的大量查詢信息
 ?
 415 
 Unsupported Media Type 
 服務器拒絕接受請求,因為媒體類型不被支持
 ?
 417 
 Expectation Failed
 ?
 500 
 Internal Server Error 
 請求不完整,服務器遇見了出乎意料的狀況
 ?
 501 
 Not Implemented 
 請求不完整,服務器不提供所需要的功能
 ?
 502 
 Bad Gateway 
 請求不完整,服務器從上游服務器接受了一個無效的響應
 ?
 503 
 Service Unavailable 
 請求不完整,服務器暫時重啟或關閉
 ?
 504 
 Gateway Timeout 
 網關超時
 ?
 505 
 HTTP Version Not Supported 
 服務器不支持所指定的HTTP版本
二 
 ?
 HTTP請求與HTTP響應的格式相近,都有著如下結構:
 ?以狀態行+CRLF(回車換行)開始
 ?零行或多行頭模塊+CRLF
 ?一個空行,比如CRLF
 ?可選的消息體比如文件,查詢數據,查詢輸出
 ?
 舉例來說,一個服務器響應頭看起來就像下面這樣: 
 HTTP/1.1 200 OK
 Content-Type: text/html
 Header2: ...
 ...
 HeaderN: ...
 ? (Blank Line)
 <!doctype ...>
 <html>
 <head>...</head>
 <body>
 ...
 </body>
 </html> 
 狀態行包含HTTP版本,一個狀態碼,和狀態碼相對應的短消息。
三 JSP對HTTP狀態碼的編程
 <一>
 HttpServletResponse 類中用來設置狀態碼的方法:
 ?
 方法 & 描述
1
 public void setStatus ( int statusCode )
 ?此方法可以設置任意的狀態碼。如果您的響應包含一個特殊的狀態碼和一個文檔,請確保在用PrintWriter返回任何內容前調用setStatus方法 
2
 public void sendRedirect(String url)
 ?此方法產生302響應,同時產生一個 Location 頭告訴URL 一個新的文檔 
3
 public void sendError(int code, String message)
 ?此方法將一個狀態碼(通常為 404)和一個短消息,自動插入HTML文檔中并發回給客戶端 
<二> HTTP狀態碼程序示例
?例子將會發送407錯誤碼給瀏覽器,然后瀏覽器將會告訴您"Need authentication!!!"。
<html> <head> <title>Setting HTTP Status Code</title> </head> <body> <%// 設置錯誤代碼,并說明原因response.sendError(407, "Need authentication!!!" ); %> </body> </html>?
四 Asp.Net對HTTP狀態碼的編程
 每次當用戶代理(可以理解為就是IE和Firefox)向Web站點請求一個URL地址,服務器都會給予回復,回復內容包括兩部分:HTTP報頭,和被請求的內容。但僅從瀏覽器上我們通常只能看到內容而看不到報頭信息。所以,我們需要通過一些瀏覽器插件來觀察他們。IE用
WebDeveloper;FireFox用Fiddler。
對SEO而言,我們需要了解的狀態代碼有:
 重定向:301和302
 被刪除:404
 服務器錯誤:500
302在asp.net中有一個很常見的原型:Response.Redirect(),請看代碼:
??? protected void Button1_Click(object sender, EventArgs e)
 ??? {
 ??????? Response.Redirect("~/target.aspx");
 ??????? //Server.Transfer("~/target.aspx");
 ??? }
 source.aspx頁面上一個Button,Click事件中代碼為Response.Redirect(~/target.aspx),點擊source.aspx頁面Button,查看該頁面對應的狀態碼,結果就是302。
客戶端/服務器之間往返的過程其實是這樣的:
 1. 點擊Button,產生回發,回發的目標頁面仍然是source.aspx,所以請求仍由source.aspx頁面進行處理,這樣才能進入source.aspx頁面的Click事件;
 2. Click事件中,Response.Redirect(~/target.aspx)所作的事情實際上就是:
 ??? 2.1 將回復中Http報頭的狀態碼改成302;
 ??? 2.1 指明302指向的頁面就是target.aspx;
 3. 瀏覽器(用戶代理)收到回復的報頭信息后,
 ??? 3.1 將URL地址欄的地址改成target.aspx;
 ??? 3.2 向target.aspx發出請求
和Response.Redirect()同樣著名的是Server.Transfer()。但使用Server.Transfer,你會發現,頁面對應的狀態碼是200,且地址欄的url并不會發生改變,仍然是source.aspx!這是因為Server.Transfer是完全在服務器端進行跳轉的。所以一種很流行但我覺得不那么正
確的說法就是:應當使用Server.Transfer()而不是Response.Redirect()來提高性能。因為在得到Server.Transfer()性能提升的同時,你應該權衡:性能的提高,和由此產生的代價。很難直接給出一個答案,這需要依靠具體的情景來做判斷。但我傾向于盡量不使用
Server.Transfer(),因為:1. 性能提升不大,節約的其實就是報頭信息的往返;2. 清晰的URL無論對于終端用戶,還是開發調試,都有很重要的作用。
 ??????? 
 302意味著重定向是暫時的,而301則是永久的重定向。
 就SEO而言,為了延續鏈接價值和排除重復內容 ,我們在以下幾種情況下都可能會用到301:
 1. 域名更換;
 2. 多個域名間映射;如www.freeflying.com和www.freeflying.cn,兩個域名其實指向的是同一個網站,這就會造成大量的重復內容,對網站的排名不利。
 3. 清除默認索引頁的重復問題:比如我們輸入www.freeflying.com/article/時,如果在IIS里進行了設定,將指向www.freeflying.com/article/Default.aspx
 4. 其他的“不同域名相同內容”的重復問題,典型的就是URL重寫后,www.freeflying.com/article/321.html和www.freeflying.com/article.aspx?id=321指向的其實都是同一個網頁內容。
對于404,最直觀的理解就是頁面不存在。如果網站是純靜態的,這很好理解;但當網站做成動態之后,如www.freeflying.com/article/321.html(映射為www.freeflying.com/article.aspx?id=321),雖然id=321的文章已經被刪除了,或者根本不存在,但
article.aspx這個頁面始終是存在的,所以HTTP報頭的狀態碼不會是404,而是200,表示請求成功。
 我們假設一個網站有id=321/342/6739……的文章都被刪除了,但蜘蛛并不知道,它仍然會進行抓取,結果它發現,這些不同的URL對應的居然全是同一個頁面。它就會將其當做重復頁面進行處理。
500意味著程序內部出現異常,比如3/0,代碼如下:
 ??? protected void Button1_Click(object sender, EventArgs e)
 ??? {
 ??????? int i, j;
 ??????? i = 8;
 ??????? j = 0;
 ??????? this.Label1.Text = (i / j).ToString();
 ??? }
 如果搜索引擎接到一個500的狀態碼時,搜索引擎會理解程序只是出現了暫時性的錯誤,它會在之后繼續抓取,查看問題是否已經解決,這并不會給網站帶來太大的問題——只要你能夠盡快恢復。但是,Asp.net自帶的個custom error的web.config配置,會讓我們在不經
意間“失誤”。理由和上面講到的404變200類似,當轉向自定義的error.aspx之后,蜘蛛得到的是成功鏈接error.aspx的200代碼,所以蜘蛛會以為報錯的originpage.aspx正常的顯示內容就是error.aspx的內容。不同url參數的originpage.aspx會被蜘蛛認為是不同的url
,所以蜘蛛會認為這些所有的url都重復了——后果是很嚴重的。
認識到問題的嚴重性之后,我們來看解決問題的辦法,
protected void Page_Load(object sender, EventArgs e){//如果你希望搜索引擎知道這個url將不再使用Response.StatusCode = 404;//如果你希望告訴搜索引擎這個url只是出現了暫時的故障Response.StatusCode = 500;//如果你想永久重定向該頁面Response.StatusCode = 301;Response.RedirectLocation = @"\website1\target.aspx";}
 
 ?
總結
以上是生活随笔為你收集整理的HTTP状态码和编程的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Struts2 - 在Action类中获
- 下一篇: 解决Java Web对Linux服务器不
