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服务器不