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

白菜1031發表於2019-05-03

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

相關文章