Http頭部字段之Disposition
- Disposition頭部字段介紹
- RFC規范介紹
- RFC 6266與RFC 2047
實習的時候公司將一個某個關于下載的Bug交給了我來修,看了代碼和日志后發現是
Disposition
字段的規范兼容性惹的鍋,因為有些協議使用的是老協議,我們的項目沒有對其進行兼容,最終我閱讀RFC的規范參考Goole瀏覽器的源碼將其解決。
Disposition頭部字段介紹
Content-Disposition
是 HTTP 響應頭(或請求頭)中的一個字段,主要用于 控制客戶端如何處理服務器返回的內容,例如:
- 是否直接顯示內容(如瀏覽器內嵌顯示 PDF)。
- 是否強制下載文件(彈出下載對話框)。
- 指定下載時的默認文件名。
-
語法格式:
Content-Disposition: inline | attachment; filename="filename.ext"
inline
:直接顯示。attachment
:強制下載。filename
:關鍵參數,文件名。
RFC規范介紹
-
RFC是什么:
RFC(Request for Comments,征求意見稿) 是一系列由 互聯網工程任務組(IETF, Internet Engineering Task Force) 發布的技術標準文檔,用于定義互聯網協議(如 TCP/IP、HTTP、DNS)、通信規范、API 設計等。RFC 文檔是互聯網基礎設施的核心參考,許多網絡協議和技術的實現都基于它們。
-
RFC的分類:
類型 說明 示例 標準(Standards Track) 正式成為互聯網標準,如 TCP/IP、HTTP、SMTP。 RFC 793 (TCP)、RFC 9110 (HTTP/1.1) 實驗性(Experimental) 尚未成熟的技術,可能被采納或廢棄。 RFC 2324 (HTCPCP,惡搞的“咖啡壺協議”) 信息性(Informational) 提供背景知識,非正式標準。 RFC 1855 (網絡禮儀指南) 歷史性(Historic) 已過時的協議或技術。 RFC 1149 (IP over Carrier Pigeon) 最佳實踐(BCP, Best Current Practice) 推薦的操作方法,如安全實踐。 RFC 6919 (DNSSEC 部署指南)
RFC 6266與RFC 2047
- RFC6266: Content-Disposition in HTTP
- 標題: “Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)”
- 發布: 2011年6月
- 狀態: 現行標準(Proposed Standard)
- 核心作用:標準化HTTP響應頭
Content-Disposition
的用法,用于指示瀏覽器如何處理服務器返回的內容(如直接顯示或下載文件)。
當傳輸的
filename
是全英文時,使用filename
參數直接用ASCII
就能表示。
- 但是如果出現中英文混合,此時就無法表示了,所以它依賴
RFC 5987
。
- RFC5987 (Character Set and Language Encoding for HTTP Headers)
-
作用:RFC6266 使用
RFC5987
定義的filename*
參數格式來解決非ASCII文件名編碼問題(如中文文件名)。其對非中文使用url encode
+utf8
轉碼的形式:Content-Disposition: attachment; filename*=UTF-8''%E4%B8%AD%E6%96%87.txt
- RFC2047: MIME Message Header Extensions
- 標題: “MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text”
- 發布: 1996年11月
- 狀態: 現行標準(Proposed Standard)
- 核心作用:
擴展電子郵件(MIME)頭部字段,支持非ASCII字符(如中文、日文)的編碼傳輸。
它處理中文的方式是將所有中文字符先轉為Base64,然后加上特定的格式進行分段(如果太長)。
- 所以我們根據 RFC 2047 規范,對于被分割成多個編碼段的連續文本,必須先合并所有分段內容,再進行整體解碼,這是協議明確規定的強制性要求。
=?UTF-8?B?YW55?= =?UTF-8?B?IGNh?= =?UTF-8?B?cmU=?=
網易郵箱就是使用的
RFC2027
標準來傳輸下載附件時的filename
。
Goole源碼參考:如果你想要對上述協議的disposition
標準都進行兼容,去模擬瀏覽器作為不同服務器的客戶端,可以參考Goole
源碼的解決辦法,它是嚴格按照協議上的規范來處理的。