搞定PHP面試 - HTTP協議知識點整理

HTTP協議知識點整理

一、HTTP協議的工作特點和工作原理

工作特點

  • 基於B/S模式
  • 通信開銷小、簡單快速、傳輸成本低
  • 使用靈活、可試用超文本傳輸協議
  • 節省傳輸時間
  • 無狀態

工作原理

客戶端發送請求給服務器,創建一個TCP鏈接,指定端口號,默認80,連接到服務器,服務器監聽瀏覽器請求,一旦監聽到客戶端請求,分析請求類型後,服務器會向客戶端放回狀態信息和數據內容。

二、HTTP協議請求方法

1. GET:獲取資源

GET 方法用來請求訪問已被 URI 識別的資源。指定的資源經服務器端解析後返回響應內容。

2. POST:傳輸實體主體

POST 方法用來傳輸實體的主體。
雖然用 GET 方法也可以傳輸實體的主體,但一般不用 GET 方法進行傳輸,而是用 POST 方法。雖說 POST 的功能與 GET 很相似,但POST 的主要目的並不是獲取響應的主體內容。

3. PUT:傳輸文件

PUT 方法用來傳輸文件。就像 FTP 協議的文件上傳一樣,要求在請求報文的主體中包含文件內容,然後保存到請求 URI 指定的位置。
但是,鑑於 HTTP/1.1 的 PUT 方法自身不帶驗證機制,任何人都可以上傳文件 , 存在安全性問題,因此一般的 Web 網站不使用該方法。若配合 Web 應用程序的驗證機制,或架構設計採用 REST(REpresentationalState Transfer,表徵狀態轉移)標準的同類 Web 網站,就可能會開放使用 PUT 方法。

4. HEAD:獲得報文首部

HEAD 方法和 GET 方法一樣,只是不返回報文主體部分。用於確認URI 的有效性及資源更新的日期時間等。

5. DELETE:刪除文件

DELETE 方法用來刪除文件,是與 PUT 相反的方法。DELETE 方法按請求 URI 刪除指定的資源。
但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一樣不帶驗證機制,所以一般的 Web 網站也不使用 DELETE 方法。當配合 Web 應用程序的驗證機制,或遵守 REST 標準時還是有可能會開放使用的。

6. OPTIONS:詢問支持的方法

OPTIONS 方法用來查詢針對請求 URI 指定的資源支持的方法。

7. TRACE:追蹤路徑

TRACE 方法是讓 Web 服務器端將之前的請求通信環回給客戶端的方法。
發送請求時,在 Max-Forwards 首部字段中填入數值,每經過一個服務器端就將該數字減 1,當數值剛好減到 0 時,就停止繼續傳輸,最後接收到請求的服務器端則返回狀態碼 200 OK 的響應。
客戶端通過 TRACE 方法可以查詢發送出去的請求是怎樣被加工修改 / 篡改的。這是因爲,請求想要連接到源目標服務器可能會通過代理中轉,TRACE 方法就是用來確認連接過程中發生的一系列操作。
但是,TRACE 方法本來就不怎麼常用,再加上它容易引發 XST(Cross-Site Tracing,跨站追蹤)攻擊,通常就更不會用到了。

三、HTTP常用狀態碼

狀態碼的職責是當客戶端向服務器端發送請求時,描述返回的請求結果。
藉助狀態碼,用戶可以知道服務器端是正常處理了請求,還是出現了錯誤。

1. 1XX Informational(信息性狀態碼, 接收的請求正在處理)

2. 2XX Success(成功狀態碼,表示請求正常處理完畢)

200 OK

表示從客戶端發來的請求在服務器端被正常處理了。

204 No Content

該狀態碼代表服務器接收的請求已成功處理,但在返回的響應報文中不含實體的主體部分。另外,也不允許返回任何實體的主體。比如,當從瀏覽器發出請求處理後,返回 204 響應,那麼瀏覽器顯示的頁面不發生更新。
一般在只需要從客戶端往服務器發送信息,而對客戶端不需要發送新信息內容的情況下使用。

206 Partial Content

該狀態碼錶示客戶端進行了範圍請求,而服務器成功執行了這部分的 GET 請求。響應報文中包含由 Content-Range 指定範圍的實體內容。

3. 3XX Redirection(重定向狀態碼,需要進行附加操作以完成請求)

301 Moved Permanently

永久性重定向。該狀態碼錶示請求的資源已被分配了新的 URI,以後應使用資源現在所指的 URI。也就是說,如果已經把資源對應的 URI保存爲書籤了,這時應該按 Location 首部字段提示的 URI 重新保存。

302 Move temporarily

臨時性重定向。該狀態碼錶示請求的資源已被分配了新的 URI,希望用戶(本次)能使用新的 URI 訪問。
和 301 Moved Permanently 狀態碼相似,但 302 狀態碼代表的資源不是被永久移動,只是臨時性質的。換句話說,已移動的資源對應的URI 將來還有可能發生改變。比如,用戶把 URI 保存成書籤,但不會像301 狀態碼出現時那樣去更新書籤,而是仍舊保留返回 302 狀態碼的頁面對應的 URI。

304 Not Modified

該狀態碼錶示客戶端發送附帶條件的請求時,服務器端允許請求訪問資源,而文檔的內容(自上次訪問以來或者根據請求的條件)並沒有改變。

4. 4XX Client Error(客戶端錯誤狀態碼,服務器無法處理請求)

400 Bad Request

該狀態碼錶示請求報文中存在語法錯誤。當錯誤發生時,需修改請求的內容後再次發送請求。

401 Unauthorized

該狀態碼錶示發送的請求需要有通過 HTTP 認證(BASIC 認證、DIGEST 認證)的認證信息。另外若之前已進行過 1 次請求,則表示用戶認證失敗。
返回含有 401 的響應必須包含一個適用於被請求資源的 WWW-Authenticate 首部用以質詢(challenge)用戶信息。當瀏覽器初次接收到 401 響應,會彈出認證用的對話窗口。

403 Forbidden

該狀態碼錶明對請求資源的訪問被服務器拒絕了。
未獲得文件系統的訪問授權,訪問權限出現某些問題(從未授權的發送源 IP 地址試圖訪問)等情況都可能是發生 403 的原因。

404 Not Found

該狀態碼錶明服務器上無法找到請求的資源。

405 Method Not Allowed

表明當前請求使用的 HTTP 方法不被服務器允許。
例如使用GET方法請求需要POST方法的數據。

5. 5XX Server Error(服務器錯誤狀態碼,服務器處理請求出錯)

500 Internal Server Error

該狀態碼錶明服務器端在執行請求時發生了錯誤。有可能是 Web 應用存在的 bug 或某些臨時的故障。

502 Bad Gateway

該狀態碼錶明服務器和網關/代理通信出錯。

503 Service Unavailable

該狀態碼錶明服務器暫時處於超負載或正在進行停機維護,現在無法處理請求。

504 Gateway Timeout 網關超時

該狀態碼錶明服務器作爲網關或代理,但是沒有及時從上游服務器收到請求。

四、HTTP協議常見請求、響應頭

1. HTTP/1.1 通用首部字段

通用首部字段是指,請求報文和響應報文雙方都會使用的首部。

Cache-Control 設置緩存的工作機制

指令的參數是可選的,多個指令之間通過 , 分隔。

Cache-Control: private, max-age=0, no-cache
  • 緩存請求指令
指令 參數 說明
no-cache 強制向源服務器再次驗證
no-store 不緩存請求或響應的任何內容
max-age = [ 秒] 必需 響應的最大Age值
max-stale( = [ 秒]) 可省略 接收已過期的響應
min-fresh = [ 秒] 必需 期望在指定時間內的響應仍有效
no-transform 代理不可更改媒體類型
only-if-cached 從緩存獲取資源
cache-extension - 新指令標記(token)
  • 緩存響應指令
指令 參數 說明
public 可向任意方提供響應的緩存
private 可省略 僅向特定用戶返回響應
no-cache 可省略 緩存前必須先確認其有效性
no-store 不緩存請求或響應的任何內容
no-transform 代理不可更改媒體類型
must-revalidate 可緩存但必須再向源服務器進行確認
proxy-revalidate 要求中間緩存服務器對緩存的響應有效性再進行確認
max-age = [ 秒] 必需 響應的最大Age值
s-maxage = [ 秒] 必需 公共緩存服務器響應的最大Age值
cache-extension - 新指令標記(token)

Connection

Connection 首部字段具備如下兩個作用。

  • 控制不再轉發給代理的首部字段
  • 管理持久連接

    Connection: keep-alive
    Connection: Upgrade

Date 創建 HTTP 報文的日期和時間。

Date: Tue, 03 Jul 2012 04:40:59 GMT
Date: Tue, 03-Jul-12 04:40:59 GMT
Date: Tue Jul 03 04:40:59 2012
Content-Type 設置請求體或相應體的MIME類型
Content-Type: application/x-www-form-urlencoded
Content-Type: text/html; charset=utf-8

Content-Encoding 設置數據使用的編碼類型

Content-Encoding: gzip

Content-Length 請求體或響應體的字節長度

Content-Length: 348

2. 常見請求頭字段

Host 設置服務器域名和TCP端口號,如果使用的是服務請求標準端口號,端口號可以省略

Host: en.wikipedia.org:8080
Host: en.wikipedia.org

Accept 設置接受的內容類型


Accept: text/plain

Accept-Charset 設置接受的字符編碼

Accept-Charset: utf-8

Accept-Encoding 設置接受的編碼格式

Accept-Encoding: gzip, deflate

Origin 標識跨域資源請求(請求服務端設置Access-Control-Allow-Origin響應字段)

Origin: http://www.example-social-network.com

User-Agent 用戶代理的字符串值

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0

Cookie 設置服務器使用Set-Cookie發送的http cookie

Cookie: $Version=1; Skin=new;

Authorization 設置HTTP身份驗證的憑證

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Referer 告知服務器請求的原始資源的 URI

Referer: http://en.wikipedia.org/wiki/Main_Page

X-Forwarded-For 客戶端通過HTTP代理或者負載均衡器連接的web服務器的原始IP地址

X-Forwarded-For: client1, proxy1, proxy2
X-Forwarded-For: 129.78.138.66, 129.78.64.103

Forwarded 客戶端通過http代理連接web服務的源信息

Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17

3. 常見響應頭字段

Allow 通知客戶端請求所支持的 HTTP 方法

Allow: GET, HEAD

Access-Control-Allow-Origin 指定哪些站點可以參與跨站資源共享

Access-Control-Allow-Origin: *

Expires 設置響應體的過期時間

Expires: Thu, 01 Dec 1994 16:00:00 GMT

Last-Modified 設置請求對象最後一次的修改日期

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

Age 對象在代理緩存中暫存的秒數

Age: 3600

ETag 特定版本資源的標識符,通常是消息摘要

ETag: "737060cd8c284d8af7ad3082f209582d"

Refresh 重定向

Refresh: 5; url=http://www.w3.org/pub/WWW/People.html

Set-Cookie 設置HTTP Cookie

Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章