標籤:狀態 語法錯誤 否則 ima 未能 媒體類型 不能 inf index.php
1. HTTP請求格式
做過Socket編程的人都知道,當我們設計一個通訊協定時,“訊息頭/訊息體”的分割方式是很常用的,訊息頭告訴對方這個訊息是幹什麼的,訊息體告訴對方怎麼幹。HTTP協議傳輸的訊息也是這樣規定的,每一個HTTP包都分為HTTP頭和HTTP體兩部分,訊息體是可選的,而訊息頭是必須的。每當我們開啟一個網頁,在上面點擊右鍵,選擇“查看源檔案”,這時看到的HTML代碼就是HTTP的訊息體,那麼訊息頭可以通過瀏覽器的開發工具或者外掛程式可以看到,如果Firefox的Firebug,IE的Httpwatch。
用戶端通過發送 HTTP 要求向伺服器請求對資源的訪問。 它向伺服器傳遞了一個資料區塊,也就是請求資訊,HTTP 要求由三部分組成:請求行、 要求標頭和請求本文。
請求行:要求方法 URI 協議/版本
要求標頭(Request Header)
請求本文
下面是一個HTTP請求的資料:
POST /index.php HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-cn,zh;q=0.5Accept-Encoding: gzip, deflateConnection: keep-aliveReferer: http://localhost/Content-Length:25Content-Type:application/x-www-form-urlencoded username=aa&password=1234
1、請求行:要求方法URI協議/版本 請求的第一行是“方法 URL 協議/版本”,並以 斷行符號換行作為結尾。請求行以空格分隔。格式如下:POST /index.php HTTP/1.1以上代碼中“GET”代表要求方法,“//ndex.php”表示URI,“HTTP/1.1代表協議和協議的版本。 根據HTTP標準,HTTP請求可以使用多種要求方法。例如:HTTP1.1支援7種要求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。 URL完整地指定了要訪問的網路資源,通常只要給出相對於伺服器的根目錄的相對目錄即可,因此總是以“/”開頭,最後,協議版本聲明了通訊過程中使用HTTP的版本。 要求方法
在 HTTP 協議中,HTTP 要求可以使用多種要求方法,這些方法指明了要以何種方式來訪問 Request-URI 所標識的資源。HTTP1.1 支援的要求方法如下表所示:
HTTP1.1 中的請求方式:
| 方法 |
作用 |
| GET |
請求擷取由 Request-URI 所標識的資源 |
| POST |
請求伺服器接收在請求中封裝的實體,並將其作為由 Request-Line 中的 Request-URI 所標識的資源的一部分 |
| HEAD |
請求擷取由 Request-URI 所標識的資源的響應訊息前序 |
| PUT |
請求伺服器儲存一個資源,並用 Request-URI 作為其標識符 |
| DELETE |
請求伺服器刪除由 Request-URI 所標識的資源 |
| TRACE |
請求伺服器回送到的請求資訊,主要用於測試或診斷 |
| CONNECT |
保留將來使用 |
| OPTIONS |
請求查詢服務器的效能,或者查詢與資源相關的選項和需求 |
重點介紹 GET、POST 和 HEAD 三個方法:
(1)GET
GET 方法用於擷取由 Request-URI 所標識的資源的資訊,常見的形式是:
GET Request-URI HTTP/1.1
GET方法是預設的HTTP要求方法,例如當我們通過在瀏覽器的地址欄中直接輸入網址的方式去訪問網頁的時候,瀏覽器採用的就是 GET 方法向伺服器擷取資源。
我們可以使用GET方法來提交表單資料,用GET方法提交的表單資料只經過了簡單的編碼,同時它將作為URL的一部分向伺服器發送,因此,如果使用GET方法來提交表單資料就存在著安全隱患上。例如:
Http://localhost/login.php?username=aa&password=1234
從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的資料是作為URL請求的一部分所以提交的資料量不能太大。這是因為瀏覽器對url的長度有限制
各種瀏覽器也會對url的長度有所限制,下面是幾種常見瀏覽器的url長度限制:(單位:字元)
IE : 2803Firefox:65536Chrome:8182Safari:80000Opera:190000
(2)POST
POST方法是GET方法的一個替代方法,它主要是向Web伺服器提交表單資料,尤其是大批量的資料。 在要求標頭資訊結束之後的兩個斷行符號換行之後(實際是空一行),就是表單提交的資料。如上面提到的post表單資料:
username=aa&password=1234
POST方法克服了GET方法的一些缺點。通過POST方法提交表單資料時,資料不是作為URL請求的一部分而是作為標準資料傳送給Web伺服器,這就克服了GET方法中的資訊無法保密和資料量太小的缺點。因此,出於安全的考慮以及對使用者隱私的尊重,通常表單提交時採用POST方法。
從編程的角度來講,如果使用者通過GET方法提交資料,則資料存放在QUERY_STRING環境變數中,而POST方法提交的資料則可以從標準輸入資料流中擷取。
GET與POST方法有以下區別:
1、 在用戶端,Get方式在通過URL提交資料,資料在URL中可以看到;POST方式,資料放在HTTP包的body中。
2、 GET方式提交的資料大小有限制(因為瀏覽器對URL的長度有限制),而POST則沒有此限制。
3、安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些資料是中文資料而且是非敏感性資料,那麼使用 get;如果使用者輸入的資料不是中文字元而且包含敏感性資料,那麼還是使用 post為好。
4.、伺服器取值方式不一樣。GET方式取值,如PHP可以使用$_GET來取得變數的值,而POST方式通過$_POST來擷取變數的值。
(3)HEAD
HEAD 方法與 GET 方法幾乎是相同的,它們的區別在於 HEAD 方法只是請求訊息前序,而不是完整的內容。對於 HEAD 請求的回應部分來說,它的 HTTP 頭部中包含的資訊與通過 GET 請求所得到的資訊是相同的。利用這個方法,不必傳輸整個資源內容,就可以得到 Request-URI 所標識的資源的資訊。這個方法通常被用於測試超連結的有效性,是否可以訪問,以及最近是否更新。
要注意的是,在 HTML 文檔中,書寫 get 和 post,大小寫都可以,但在 HTTP 協議中的 GET 和 POST 只能是大寫形式。
2. 要求標頭
每個頭域由一個網域名稱,冒號(:)和域值三部分組成。網域名稱是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴充為多行,在每行開始處,使用至少一個空格或定位字元。
HTTP最常見的要求標頭如下:
Transport 頭域
Connection:
作用:表示是否需要持久串連。
如果伺服器看到這裡的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1預設進行持久串連),它就可以利用持久串連的優點,當頁麵包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,伺服器需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入 ByteArrayOutputStream,然後在正式寫出內容之前計算它的大小;
例如: Connection: keep-alive 當一個網頁開啟完成後,用戶端和伺服器之間用於傳輸HTTP資料的TCP串連不會關閉,如果用戶端再次訪問這個伺服器上的 網頁,會繼續使用這一條已經建立的串連
例如: Connection: close 代表一個Request完成後,用戶端和伺服器之間用於傳輸HTTP資料的TCP串連會關閉, 當用戶端再次發送Request,需要重建立立TCP串連。
Host(發送請求時,該前序域是必需的)
Host請求前序域主要用於指定被請求資源的Internet主機和連接埠號碼,它通常從HTTP URL中提取出來的。
eg:http://;localhost/index.html
瀏覽器發送的請求訊息中,就會包含Host請求前序域,如下:
Host:localhost
此處使用預設連接埠號碼80,若指定了連接埠號碼8080,則變成:Host:localhost:8080
Client 頭域
Accept:
作用:瀏覽器可以接受的媒體類型(MIME類型),
例如: Accept: text/html 代表瀏覽器可以接受伺服器回傳的類型為 text/html 也就是我們常說的html文檔, 如果伺服器無法返回text/html類型的資料,伺服器應該返回一個406錯誤(non acceptable)。
萬用字元 * 代表任意類型。例如 Accept: */* 代表瀏覽器可以處理所有類型,(一般瀏覽器發給伺服器都是發這個)
Accept-Encoding:
作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支援壓縮,支援什麼壓縮方法(gzip,deflate),(注意:這不是隻字符編碼);
例如: Accept-Encoding: gzip, deflate。Server能夠向支援gzip/deflate的瀏覽器返回經gzip或者deflate編碼的HTML頁面。 許多情形下這可以減少5到10倍的下載時間,也節省頻寬。
Accept-Language:
作用: 瀏覽器申明自己接收的語言。
語言跟字元集的區別:中文是語言,中文有多種字元集,比如big5,gb2312,gbk等等;
例如: Accept-Language:zh-cn 。如果請求訊息中沒有設定這個前序域,伺服器假定用戶端對各種語言都可以接受。
User-Agent:
作用:告訴HTTP伺服器, 用戶端使用的作業系統和瀏覽器的名稱和版本.
我們上網登陸論壇的時候,往往會看到一些歡迎資訊,其中列出了你的作業系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上, 伺服器應用程式就是從User-Agent這個請求前序域中擷取到這些資訊User-Agent請求前序域允許用戶端將它的作業系統、瀏覽器和其它屬性告訴伺服器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Accept-Charset:
作用:瀏覽器申明自己接收的字元集,這就是本文前面介紹的各種字元集和字元編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字元編碼方案);
例如:Accept-Charset:iso-8859-1,gb2312.如果在請求訊息中沒有設定這個域,預設是任何字元集都可以接受。
Authorization:授權資訊,通常出現在對伺服器發送的WWW-Authenticate頭的應答中;
Authorization請求前序域主要用於證明用戶端有權查看某個資源。當瀏覽器訪問一個頁面時,如果收到伺服器的響應代碼為401(未授權),可以發送一個包含Authorization請求前序域的請求,要求伺服器對其進行驗證。
Cookie/Login 頭域
Cookie:
作用: 最重要的header, 將cookie的值發送給HTTP 伺服器
Entity頭域
Content-Length
作用:發送給HTTP伺服器資料的長度。即請求訊息本文的長度;
例如: Content-Length: 38
Content-Type:
作用:
例如:Content-Type: application/x-www-form-urlencoded
Miscellaneous 頭域
Referer:
作用: 提供了Request的上下文資訊的伺服器,告訴伺服器我是從哪個連結過來的,比如從我首頁上連結到一個朋友那裡, 他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點擊我首頁上的連結訪問 他的網站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Cache 頭域
If-Modified-Since:
作用: 把瀏覽器端快取頁面面的最後修改時間發送到伺服器去,伺服器會把這個時間與伺服器上實際檔案的最後修改時間進行對比。如果時間一致,那麼返回304,用戶端就直接使用本機快取檔案。如果時間不一致,就會返回200和新的檔案內容。用戶端接到之後,會丟棄舊檔案,把新檔案快取起來,並顯示在瀏覽器中。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。
If-None-Match:
作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag資訊。 當使用者再次請求該資源時,將在HTTP Request 中加入If-None-Match資訊(ETag的值)。如果伺服器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴用戶端使用本機快取檔案。否則將返回200狀態和新的資源和Etag. 使用這樣的機制將提高網站的效能
例如: If-None-Match: "03f2b33c0bfcc1:0"
Pragma:
作用: 防止頁面被緩衝, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣
Pargma只有一個用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control
Cache-Control:
作用: 這個是非常重要的規則。 這個用來指定Response-Request遵循的緩衝機制。各個指令含義如下
Cache-Control:Public 可以被任何緩衝所緩衝()
Cache-Control:Private 內容只緩衝到私人緩衝中
Cache-Control:no-cache 所有內容都不會被緩衝
2. HTTP響應格式
在接收和解釋請求訊息後,伺服器會返回一個 HTTP 響應訊息。與 HTTP 要求類似,HTTP 響應也是由三個部分組成,分別是:狀態行、訊息前序和響應本文。如:
HTTP/1.1 200 OKDate: Sun, 17 Mar 2013 08:12:54 GMTServer: Apache/2.2.8 (Win32) php/5.2.5X-Powered-By: PHP/5.2.5Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Length: 4393Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: text/html; charset=utf-8
<html><head><title>HTTP響應樣本<title></head><body>Hello HTTP!</body></html>
1、狀態行
狀態行由協議版本、數字形式的狀態碼,及相應的狀態原因組成,各元素之間以空格分隔,結尾時斷行符號分行符號,格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version 表示伺服器 HTTP 協議的版本,Status-Code 表示伺服器發回的響應代碼,Reason-Phrase 表示狀態碼的文本描述,CRLF 表示斷行符號換行。例如:
HTTP/1.1 200 OK (CRLF)
狀態碼與狀態原因
狀態碼由 3 位元字組成, 表示請求是否被理解或被滿足,狀態原因給出了關於狀態代碼的簡短的文字描述。狀態代碼的第一個數字定義了響應類別,後面兩位元字沒有具體分類。第一個數字有 5 種取值,如下所示。
- 1xx:指示資訊——表示請求已經接受,繼續處理
- 2xx:成功——表示請求已經被成功接收、理解、接受。
- 3xx:重新導向——要完成請求必須進行更進一步的操作
- 4xx:用戶端錯誤——請求有語法錯誤或請求無法實現
- 5xx:伺服器端錯誤——伺服器未能實現合法的請求。
常見狀態碼、狀態原因、說明:
200 OK //用戶端請求成功
400 Bad Request //用戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態碼必須和WWW-Authenticate前序域一起使用
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理用戶端的請求,一段時間後可能恢複正常
2、響應本文
響應本文就是伺服器返回的資源的內容,回應標頭和本文之間也必須用空行分隔。如:
- <html>
- <head>
- <title>HTTP響應樣本<title>
- </head>
- <body>
- Hello HTTP!
- </body>
- </html>
3 、回應標頭資訊
HTTP最常見的回應標頭如下所示:
Cache頭域
Date:
作用:產生訊息的具體時間和日期,即當前的GMT時間。
例如: Date: Sun, 17 Mar 2013 08:12:54 GMT
Expires:
作用: 瀏覽器會在指定到期時間內使用本機快取,指明應該在什麼時候認為文檔已經到期,從而不再緩衝它。
例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT
Vary
作用:
例如: Vary: Accept-Encoding
Cookie/Login 頭域
P3P
作用: 用於跨網域設定Cookie, 這樣可以解決iframe跨域訪問cookie的問題
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie
作用: 非常重要的header, 用於把cookie 發送到用戶端瀏覽器, 每一個寫入cookie都會產生一個Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Entity實體頭域:
實體內容的屬性,包括實體資訊類型,長度,壓縮方法,最後一次修改時間,資料有效性等。
ETag:
作用: 和If-None-Match 配合使用。 (執行個體請看上節中If-None-Match的執行個體)
例如: ETag: "03f2b33c0bfcc1:0"
Last-Modified:
作用: 用於指示資源的最後修改日期和時間。(執行個體請看上節的If-Modified-Since的執行個體)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Content-Type:
作用:WEB伺服器告訴瀏覽器自己響應的對象的類型和字元集,
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Length:
指明實體本文的長度,以位元組方式儲存的十進位數字來表示。在資料下行的過程中,Content-Length的方式要預先在伺服器中緩衝所有資料,然後所有資料再一股腦兒地發給用戶端。
例如: Content-Length: 19847
Content-Encoding:
作用:文檔的編碼(Encode)方法。一般是壓縮方式。
WEB伺服器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。
例如:Content-Encoding:gzip
Content-Language:
作用: WEB伺服器告訴瀏覽器自己響應的對象的語言者
例如: Content-Language:da
Miscellaneous 頭域
Server:
作用:指明HTTP伺服器的軟體資訊
例如:Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By:
作用:表示網站是用什麼技術開發的
例如: X-Powered-By: PHP/5.2.5
Transport頭域
Connection:
例如: Connection: keep-alive 當一個網頁開啟完成後,用戶端和伺服器之間用於傳輸HTTP資料的TCP串連不會關閉,如果用戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的串連
例如: Connection: close 代表一個Request完成後,用戶端和伺服器之間用於傳輸HTTP資料的TCP串連會關閉, 當用戶端再次發送Request,需要重建立立TCP串連。
Location頭域
Location:
作用: 用於重新導向一個新的位置, 包含新的URL地址
執行個體請看304狀態執行個體
HTTP協議是無狀態的和Connection: keep-alive的區別
無狀態是指協議對於交易處理沒有記憶能力,伺服器不知道用戶端是什麼狀態。從另一方面講,開啟一個伺服器上的網頁和你之前開啟這個伺服器上的網頁之間沒有任何聯絡。
HTTP是一個無狀態的連線導向的協議,無狀態不代表HTTP不能保持TCP串連,更不能代表HTTP使用的是UDP協議(無串連)。
從HTTP/1.1起,預設都開啟了Keep-Alive,保持串連特性,簡單地說,當一個網頁開啟完成後,用戶端和伺服器之間用於傳輸HTTP資料的TCP串連不會關閉,如果用戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的串連。
Keep-Alive不會永久保持串連,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。
3. 瀏覽器緩衝
瀏覽器緩衝:包括頁面html緩衝和圖片js,css等資源的緩衝。如,瀏覽器緩衝是基於把頁面資訊儲存到使用者本地電腦硬碟裡。
1、緩衝的優點:
1)伺服器響應更快:因為請求從快取服務器(離用戶端更近)而不是原始伺服器被相應,這個過程耗時更少,讓伺服器看上去響應更快。
2)減少網路頻寬消耗:當副本被重用時會減低用戶端的頻寬消耗;客戶可以節省頻寬費用,控制頻寬的需求的增長並更易於管理。
1、緩衝工作原理
頁面緩衝狀態是由http header決定的,一個瀏覽器請求資訊,一個是伺服器響應資訊。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0規定,Cache-Control由HTTP/1.1規定。
工作原理圖:
我們可以看到原理主要分三步:
- 第一次請求:瀏覽器通過http的header前序,附帶Expires,Cache-Control,Last-Modified/Etag向伺服器請求,此時伺服器記錄第一次請求的Last-Modified/Etag
- 再次請求:當瀏覽器再次請求的時候,要求標頭附帶Expires,Cache-Control,If-Modified-Since/Etag向伺服器請求
- 伺服器根據第一次記錄的Last-Modified/Etag和再次請求的If-Modified-Since/Etag做對比,判斷是否需要更新,伺服器通過這兩個頭判斷本地資源未發生變化,客 戶端不需要重新下載,返回304響應。常見流程如所示:
與緩衝相關的HTTP擴充訊息頭
Expires:設定頁面到期時間,格林威治時間GMT
Cache-Control:更細緻的控制緩衝的內容
Last-Modified:請求對象最後一次的修改時間 用來判斷緩衝是否到期 通常由檔案的時間資訊產生
ETag:響應中資源的校正值,在伺服器上某個時段是唯一標識的。ETag是一個可以 與Web資源關聯的記號(token),和Last-Modified功能才不多,也是一個標識符,一般和Last-Modified一起使用,加強伺服器判斷的準確度。
Date:伺服器的時間
If-Modified-Since:用戶端存取的該資源最後一次修改的時間,用來和伺服器端的Last-Modified做比較
If-None-Match:用戶端存取的該資源的檢驗值,同ETag。
Cache-Control的主要參數
Cache-Control: private/public Public 響應會被緩衝,並且在多使用者間共用。 Private 響應只能夠作為私人的緩衝,不能再使用者間共用。
Cache-Control: no-cache:不進行緩衝
Cache-Control: max-age=x:緩衝時間 以秒為單位
Cache-Control: must-revalidate:如果頁面是到期的 則去伺服器進行擷取。
2、關於圖片,css,js,flash的緩衝
這個主要通過伺服器的配置來實現這個技術,如果使用apache伺服器的話,可以使用mod_expires模組來實現:
編譯mod_expires模組:
Cd /root/httpd-2.2.3/modules/metadata
/usr/local/apache/bin/apxs -i -a -c mod_expires.c //編譯
編輯httpd.conf配置:添加下面內容
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
ExpiresByType text/html "access plus 1 months"
ExpiresByType text/css "access plus 1 months"
ExpiresByType image/gif "access plus 1 months"
ExpiresByType image/jpeg "access plus 1 months"
ExpiresByType image/jpg "access plus 1 months"
ExpiresByType image/png "access plus 1 months"
EXpiresByType application/x-shockwave-flash "access plus 1 months"
EXpiresByType application/x-JavaScript "access plus 1 months"
#ExpiresByType video/x-flv "access plus 1 months"
</IfModule>
解釋:第一句--開啟服務
第二句--預設時間是一個月
在下面是關於各種類型的資源的緩衝時間設定
HTTP協議(2)-------- 網路編程