理解HTTP訊息頭 (二)

來源:互聯網
上載者:User
文章目錄
  • 1 403 Access Forbidden
  • 2 404 Object not found
  • 3 401 Access Denied
  • 4 302 Object Moved
  • 5 500 Internal Server Error
理解HTTP訊息頭 (二)常見的HTTP返回碼上一篇文章裡我簡要的說了說HTTP訊息頭的格式,注意到在伺服器返回的HTTP訊息頭裡有一個“HTTP/1.1 200 OK”,這裡的200是HTTP規定的傳回碼,表示請求已經被正常處理完成。瀏覽器通過這個傳回碼就可以知道伺服器對所發請求的處理情況是什麼,每一種傳回碼都有自己的含義。這裡列舉幾種常見的返回碼。1 403 Access Forbidden如果我們試圖請求伺服器上一個檔案夾,而在WEB伺服器上這個檔案夾並沒有允許對這個檔案夾列目錄的話,就會返回這個代碼。一個完整的403回複可能是這樣的:(IIS5.1)
HTTP/1.1 403 Access Forbidden
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 08:57:39 GMT
Connection: close
Content-Type: text/html
Content-Length: 172 <html><head><title>Directory Listing Denied</title></head>
<body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html>2 404 Object not found當我們請求的對象在伺服器上並不存在時,就會給出這個傳回碼,這可能也是最常見的錯誤碼了。IIS給出的404訊息內容很長,除了訊息頭以外還有一個完整的說明“為什麼會這樣”的網頁。APACHE伺服器的404訊息比較簡短,如下:
HTTP/1.1 404 Not Found
Date: Mon, 06 Mar 2006 09:03:14 GMT
Server: Apache/2.0.55 (Unix) PHP/5.0.5
Content-Length: 291
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /notexist was not found on this server.</p>
<hr>
<address>Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080</address>
</body></html>也許你會問,無論是404還是200,都會在訊息體內給出一個說明網頁,那麼對於用戶端來說二者有什麼區別呢?一個比較明顯的區別在於200是成功請求,瀏覽器會記錄下這個地址,以便下次再訪問時可以自動提示該地址,而404是失敗請求,瀏覽器只會顯示出返回的頁面內容,並不會記錄此地址,要再次訪問時還需要輸入完整的地址。3 401 Access Denied當WEB伺服器不允許匿名訪問,而我們又沒有提供正確的使用者名稱/密碼時,伺服器就會給出這個傳回碼。在IIS中,設定IIS的安全屬性為不允許匿名訪問(如),此時直接存取的話就會得到以下返回結果:
HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 09:15:55 GMT
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Connection: close
Content-Length: 3964
Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
……
此時瀏覽器上給出的提示如,讓我們輸入使用者名稱和密碼:因返回資訊中訊息體較長,只取前面兩行內容。注意,如果是用localhost來訪問原生IIS,因IE可以直接取得目前使用者的身份,它會和伺服器間直接進行協商,所以不會看到401提示。
當我們在輸入了使用者名稱和密碼以後,伺服器與用戶端會再進行兩次對話。首先用戶端向伺服器索取一個公開金鑰,伺服器端會返回一個公開金鑰,二者都用BASE64編碼,相應的訊息如下(編碼部分已經做了處理):GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 192.168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate ABCDEFG…… HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 09:20:53 GMT
WWW-Authenticate: Negotiate HIJKLMN……
Content-Length: 3715
Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
……
用戶端拿到公開金鑰之後使用公開金鑰對使用者名稱和密碼進行加密碼,然後把加密以後的結果重新發給伺服器:
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 192.168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate OPQRST……這樣,如果驗證通過,伺服器端就會把請求的內容發送過來了,也就是說禁止匿名訪問的網站會經過三次請求才可以看到頁面。但因為用戶端瀏覽器已經緩衝了公開金鑰,用同一個瀏覽器視窗再次請求這個網站上的其它頁面時就可以直接發送驗證資訊,從而一次互動就可以完成了。4 302 Object Moved用過ASP的人都知道ASP中頁面重新導向至少有Redirect和Transfer兩種方法。二的區別在於Redirect是用戶端重新導向,而Transfer是伺服器端重新導向,那麼它們具體是如何通過HTTP訊息頭實現的呢?
先來看一下Transfer的例子:
例如ASP檔案1.asp只有一行
<% Server.Transfer "1.htm" %>
HTML檔案1.htm也只有一行:
<p>this is 1.htm</p>
如果我們從瀏覽器裡請求1.asp,發送的請求是:
GET /1.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP注意請求的檔案確實是1.asp,而得到的回應則是:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:52:44 GMT
X-Powered-By: ASP.NET
Content-Length: 20
Content-Type: text/html
Cache-control: private <p>this is 1.htm</p>
不難看出,通過Server.Transfer語句伺服器端已經做了頁面重新導向,而用戶端對此一無所知,表面上看上去得到的就是1.asp的結果。
如果把1.asp的內容改為:
<% Response.Redirect "1.htm" %>
再次請求1.asp,發送的請求沒有變化,得到的回應卻變成了:
HTTP/1.1 302 Object moved
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:55:57 GMT
X-Powered-By: ASP.NET
Location: 1.htm
Content-Length: 121
Content-Type: text/html
Cache-control: private <head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="">here</a>.</body>注意HTTP的傳回碼由200變成了302,表示這是一個重新導向訊息,用戶端需要根據訊息頭中Location欄位的值重新發送請求,於是就有了下面一組對話:
GET /1.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
If-Modified-Since: Thu, 02 Mar 2006 06:50:13 GMT
If-None-Match: "b224758ec53dc61:9f0"
Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAPHTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
X-Powered-By: ASP.NET
Date: Mon, 06 Mar 2006 12:55:57 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 06 Mar 2006 12:52:32 GMT
ETag: "76d85bd51c41c61:9f0"
Content-Length: 20 <p>this is 1.htm</p>
很明顯,兩種重新導向方式雖然看上去結果很像,但在實現原理上有很大的不同。5 500 Internal Server Error500號錯誤發生在伺服器程式有錯誤的時候,例如,ASP程式為
<% if %>
顯然這個程式並不完整,於是得到的結果為:
HTTP/1.1 500 Internal Server Error
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:58:55 GMT
X-Powered-By: ASP.NET
Content-Length: 4301
Content-Type: text/html
Expires: Mon, 06 Mar 2006 12:58:55 GMT
Set-Cookie: ASPSESSIONIDACCTRTTT=ALKDJOPBPPKNPCNOEPCNOOPD; path=/
Cache-control: private<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html dir=ltr>
……伺服器發送了500號錯誤,並且後面通過HTML的方式說明了錯誤的原因。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.