文章目錄
- 1 Content-Type
- 2 Content-Disposition
- 3 Content-Type與Content-Disposition
- 4 Cache
理解HTTP訊息頭 (四)
伺服器返回的訊息
伺服器返回的HTTP訊息也分為訊息頭和訊息體兩部分。前面連載的第二篇裡已經介紹了返回訊息中常見傳回碼的含義。對於非正常的傳回碼的處理比較簡單,只要照著要求去做就好了,而對於正常的傳回碼(200),其處理方式就多種多樣了。
1 Content-TypeContent-Type是返回訊息中非常重要的內容,它標識出這個返回內容的類型,其值為“主類型/子類型”的格式,例如最常見的就是text/html,它的意思是說返回的內容是文本類型,這個文本又是HTML格式的。原則上瀏覽器會根據Content-Type來決定如何顯示返回的訊息體內容。常見的內容類型有:
text/html HTML文本
image/jpeg JPG圖片
image/gif GIF圖片
application/xml XML文檔
audio/x-mpegurl MP3檔案清單,如果安裝了Winamp,則可以直接把它當面M3U檔案來開啟
更多的內容類型可以在註冊表“HKCR/MIME/Database/Content Type”下看到
對於IE6瀏覽器來說,如果Content-Type中的類型和實際的訊息體類型不一致,那麼它會根據內容中的類型來分析實際應該是什麼類型,對於JPG、GIF等常用圖片格式都可以正確的識別出來,而不管Content-Type中寫的是什麼。
如果Content-Type中指定的是瀏覽器可以直接開啟的類型,那麼瀏覽器就會直接開啟其內容顯示出來,如果是被關聯到其它應用程式的類型,這時就要尋找註冊表中關於這種類型的註冊情況,如果是允許直接開啟而不需要詢問的,就會直接調出這個相關 App程式來開啟這個檔案,但如果是不允許直接開啟的,就會詢問是否開啟。對於沒有關聯到任何應用程式的類型,IE瀏覽器不知道它該如何開啟,此時IE6就會把它當成XML來嘗試開啟。2 Content-Disposition如果用AddHeader的方法在HTTP訊息頭中加入Content-Disposition段,並指定其值為“attachment”,那麼無論這個檔案是何類型,瀏覽器都會提示我們下載此檔案,因為此時它認為後面的訊息體是一個“附件”,不需要由瀏覽器來處理了。例如,在ASP.Net中寫入如下語句:
Response.AddHeader("Content-Disposition: attachment");
請求此頁面是得到的結果如:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 23 Mar 2006 07:54:53 GMT
Content-Disposition: attachment
Cache-Control: private
Content-Type: text/html; charset=utf-8
……
也就是說,通過AddHeader函數可以為HTTP訊息頭加入我們自訂的內容。使用這種方法可以強制讓瀏覽器提示下載檔案,即使這個檔案是我們已知的類型,基於是HTML網頁。如果想要讓使用者下載時提示一個預設的檔案名稱,只需要在前面一句話後加上“filename=檔案名稱”即可。例如:
Response.AddHeader("Content-Disposition: attachment; filename=mypage.htm");3 Content-Type與Content-Disposition
如果把Content-Type和Content-Disposition結合在一起使用會怎麼樣呢?
開啟一個網頁時,瀏覽器會首先看是否有Content-Disposition: attachment這一項,如果有,無論Content-Type的值是什麼,都會提示檔案下載。
如果指定了filename,就會提示預設的檔案名稱為此檔案名稱。注意到在IE6中除了“儲存”按扭外還有“開啟”按扭,此時開啟檔案的類型是由在filename中指定的副檔名決定的,例如讓filename=mypic.jpg,瀏覽器就會尋找預設的圖片查看器來開啟此檔案。
如果沒有指定filename,那麼瀏覽器就根據Content-Type中的類型來決定檔案的類型,例如Content-Type類型為image/gif,那麼就會去尋找預設的看GIF圖片的工具,並且設定此檔案的名字為所請求的網頁的主名(不帶副檔名)加上對應於此檔案類弄副檔名,例如請求的mypage.aspx,就會自動變成mypage.gif。如果並沒有指定Content-Type值,那麼就預設它為“text/html”,並且儲存的檔案名稱就是所請求的網頁檔案名稱。
但如果沒有指定Content-Disposition,那麼就和前面關於Content-Type中所討論的情況是一樣的了。
4 Cache
返回訊息中的Cache用於指定網頁緩衝。我們經常可以看到這樣的情況,開啟一個網頁時速度不快,但再次開啟時就會快很多,原因是瀏覽器已經對此頁面進行了緩衝,那麼在同一瀏覽器視窗中再次開啟此頁時不會重新從伺服器端擷取。網頁的緩衝是由HTTP訊息頭中的“Cache-control”來控制的,常見的取值有private、no-cache、max-age、must-revalidate等,預設為private。其作用根據不同的重新瀏覽方式分為以下幾種情況:
(1) 開啟新視窗
如果指定cache-control的值為private、no-cache、must-revalidate,那麼開啟新視窗訪問時都會重新訪問伺服器。而如果指定了max-age值,那麼在此值內的時間裡就不會重新訪問伺服器,例如:
Cache-control: max-age=5
表示當訪問此網頁後的5秒內再次訪問不會去伺服器
(2) 在地址欄斷行符號
如果值為private或must-revalidate(和網上說的不一樣),則只有第一次訪問時會訪問伺服器,以後就不再訪問。如果值為no-cache,那麼每次都會訪問。如果值為max-age,則在到期之前不會重複訪問。
(3) 按後退按扭
如果值為private、must-revalidate、max-age,則不會重訪問,而如果為no-cache,則每次都重複訪問
(4) 按重新整理按扭
無論為何值,都會重複訪問
當指定Cache-control值為“no-cache”時,訪問此頁面不會在Internet臨時文章夾留下頁面備份。
另外,通過指定“Expires”值也會影響到緩衝。例如,指定Expires值為一個早已過去的時間,那麼訪問此網時若重複在地址欄按斷行符號,那麼每次都會重複訪問:
Expires: Fri, 31 Dec 1999 16:00:00 GMT
在ASP中,可以通過Response對象的Expires、ExpiresAbsolute屬性控制Expires值;通過Response對象的CacheControl屬性控制Cache-control的值,例如:
Response.ExpiresAbsolute = #2000-1-1# ' 指定絕對的到期時間,這個時間用的是伺服器當地時間,會被自動轉換為GMT時間
Response.Expires = 20 ' 指定相對的到期時間,以分鐘為單位,表示從目前時間起過多少分鐘到期。
Response.CacheControl = "no-cache"
Expires值是可以通過在Internet臨時檔案夾中查看臨時檔案的屬性看到的,如: