您好,登錄后才能下訂單哦!
Hypertext Transfer Protocol(HTTP)協議(RFC7230)
一種無狀態的、應用層、以請求/應答方式運行的協議,它使用可擴展的語義和自描述消息格式,與基于網絡的超文本信息系統靈活的互動。
Request-line = method SP request-target SP HTTP-version CRLF
GET:主要的獲取信息方法,大量的性能優化都針對該方法,冪等方法
HEAD:類似GET方法,但服務器不發送BODY,用以獲取HEAD元數據,冪等方法
POST:常用于提交HTML FORM表單、新增資源等
PUT:更新資源,帶條件時是冪等方法
DELETE:刪除資源,冪等方法
CONNECT:建立tunnel隧道
OPTIONS:顯示服務器對訪問資源支持的方法,冪等方法
TRACE:回顯服務器收到的請求,用于定位問題。有安全風險
origin-form:后端請求資源的路徑,為空時傳遞/
absolute-form:用于正向代理
authority-form:用于CONNECT方法
asterisk-form:用于OPTIONS方法
HTTP/0.9:只支持GET,已過時
HTTP/1.0:RFC1945,1996,常見使用于代理服務器(例如NGINX默認配置)
HTTP/1.1:RFC2616,1999
HTTP/2.0:2015.5 正式發布
Status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
Reason-phrase=*(HTAB/SP/VCHAR/obs-text)
響應碼規范:RFC6585(2012.4) RFC7231 (2014.6)
1xx:請求已經收到,需要進一步處理才能完成,HTTP1.0不支持
2xx:成功處理請求
3xx:重定向使用Location指向的資源或者緩存中的資源。在RFC2068中規定客戶端重定向次數不應超過5次,以防止死循環
4xx:客戶端出現錯誤
5xx:服務器端出現錯誤
connection:keep-alive 長連接(HTTP/1.1默認使用長連接,keep-alive無意義)
connection:close 短連接
HTTP/1.1規范要求,不傳遞Host頭部則返回400錯誤響應碼
host頭部用于http消息在服務器端路由
Host頭部與消息的路由
1、建立TCP連接
確定服務器的IP地址
2、接收請求
3、尋找虛擬主機
匹配Host頭部與域名
4、尋找URI的處理代碼
匹配URI
5、執行處理請求的代碼
訪問資源
6、生成HTTP響應
各中間件基于PF架構串行修改響應
7、發送HTTP響應
8、記錄訪問日志
X-Forwarded-For:用于代理服務器傳遞IP
X-Real-IP:用于傳遞用戶IP
Max-Forwards:限制Proxy代理服務器的最大轉發次數,僅對TRACE/OPTIONS方法有效
Via:指明經過的代理服務器名稱及版本
Cache-Control:禁止代理服務器修改響應包體
User-Agent:指明客戶端的類型信息,服務器可以據此對資源的表述做抉擇
Referer:瀏覽器對來自某一頁面的請求自動添加的頭部
From:主要用于網絡爬蟲,告訴服務器如何通過郵件聯系到爬蟲的負責人
Server:指明服務器上所用軟件的信息,用于幫助客戶端定位問題或統計數據
Allow:告訴客戶端,服務器上該URI對應的資源允許哪些方法的執行
Accept-Ranges:告訴客戶端服務器上該資源是否允許range請求(允許服務器基于客戶端的請求只發送響應包體的一部分給到客戶端,而客戶端自動將多個片段的包體組合成完整的體積更大的包體)
Accept-Encoding:內容編碼,主要指壓縮算法協商
Accept-Language:語言協商
Content-type:資源表述,媒體類型、編碼
Content-encoding:資源表述,內容編碼
Content-Language:資源表述,語言
Content-Length:使用Content-Length頭部明確指出包體長度
Transfer-Encoding:指明使用Chunk 傳輸方式,含Transfer-Encoding 頭部后Content-Length頭部應被忽略
TE頭部:客戶端在請求在聲明是否接受Trailer頭部
Trailer頭部:服務器告知接下來chunk包體會傳輸哪些Trailer頭部
以下頭部不允許出現在Trailer 的值中:
用于信息分幀的首部(例如Transfer-Encoding 和Content-Length)
用于路由用途的首部(例如Host)
請求修飾首部(例如控制類和條件類的,如Cache-Control, Max-Forwards, 或者TE)
身份驗證首部(例如Authorization或者Set-Cookie)
Content-Encoding, Content-Type, Content-Range, 以及Trailer 自身
disposition-type =" inline"|" attachment"| disp-ext-type
inline: 指定包體是以inline 內聯的方式,作為頁面的一部分展示
attachment: 指定瀏覽器將包體以附件的方式下載
在multipart/form-data類型應答中,可以用于子消息體部分
Cookie-header:Cookie頭部中可以存放多個name/value 名值對
Set-Cookie:Set-Cookie頭部一次只能傳遞1個name/value名值對,響應中可以包含多個頭部
Access-Control-Request-Method:在preflight預檢請求(OPTIONS)中,告知服務器接下來的請求會使用哪些方法
Access-Control-Request-Headers:在preflight預檢請求(OPTIONS)中,告知服務器接下來的請求會傳遞哪些頭部
Access-Control-Allow-Methods:在preflight預檢請求的響應中,告知客戶端后續請求允許使用的方法
Access-Control-Allow-Headers:在preflight預檢請求的響應中,告知客戶端后續請求允許攜帶的頭部
Access-Control-Max-Age:在preflight預檢請求的響應中,告知客戶端該響應的信息可以緩存多久
Access-Control-Expose-Headers:告知瀏覽器哪些響應頭部可以供客戶端使用,默認情況下只有Cache-Control.、Content-Language、Content-Type、Expires、 Last-Modified、Pragma 可供使用
Access-Control-Allow-Origin:告知瀏覽器允許哪些域訪問當前資源, *表示允許所有域。 為避免緩存錯亂,響應中需要攜帶Vary: Origin
Access-Control-Allow-Credentials:告知瀏覽器是否可以將Credentials暴露給客戶端使用,Credentials包含cookie、 authorization類頭部、TLS證書等。
Etag:給出當前資源表述的標簽
Last-Modified:表示對應資源表述的上次修改時間
驗證請求
若緩存響應中含有Last-Modified頭部
If-Unmodified-Since
If-Modified-Since
If-Range
若緩存響應中含有Etag頭部
If-None-Match
If-Match
If-Range
Age:Age表示自源服務器發出響應(或者驗證過期緩存) ,到使用緩存的響應發出時經過的秒數
Cache-Control:緩存控制頭部
Cache-Control頭部在請求中的值
Max-age:告訴服務器,客戶端不會接受Age超出max-age秒的緩存
Max-stale:告訴服務器,即使緩存不再新鮮,但陳舊秒數沒有超出max-stale時,客戶端扔打算使用。若max-stale后沒有值,則表示無論過期多久客戶端都可使用
Min-fresh:告訴服務器,Age至少經過min-fresh秒后緩存才可使用
No-cache:告訴服務器,不能直接使用已有緩存作為響應返回,除非帶著緩存條件到上游服務端得到304驗證返回碼才可使用現有緩存
No-store:告訴各代理服務器不要對該請求的響應緩存(實際有不少不遵守該規定的代理服務器)
No-transform:告訴代理服務器不要修改消息包體的內容
Only-if-cached:告訴服務器僅能返回緩存的響應,否則若沒有緩存則返回504錯誤碼
Cache-Control頭部在響應中的值
Must-revalidate:告訴客戶端一旦緩存過期,必須向服務器驗證后才可使用
Proxy-revalidate:與Must-revalidate類似,但它僅對代理服務器的共享緩存有效
No-cache:告訴客戶端不能直接使用緩存的響應,使用前必須在源服務器驗證得到304返回碼。如果no-cache后指定頭部,則若客戶端的后續請求及響應中不含有這些頭則可直接使用緩存
Max-age:告訴客戶端緩存Age超出max-age秒后則緩存過期
S-maxage:與max-age相似,但僅對共享緩存,且優先級高于max-age和Expires
public:表示無論私有緩存或者共享緩存,皆可將該響應緩存
private:表示該響應不能被代理服務器作為共享緩存使用。若private后指定頭部,則在告訴代理服務器不能緩存指定的頭部,但可緩存其他部分
No-store:告訴所有下游節點不能對響應進行緩存
No-transform:告訴代理服務器不能修改消息包體的內容
Location :當瀏覽器接收到重定向響應碼時,需要讀取響應頭部Location頭部的值,獲取到新的URI再跳轉訪問該頁面
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。