HTTP Range 請求,即范圍請求,是一種 HTTP 請求方法,允許客戶端請求資源的部分數據。這種請求在處理大型文件(如視頻、音頻、或大文件下載)時特別有用,因為它可以有效地進行斷點續傳和按需加載數據,減少帶寬消耗和提高傳輸效率。
HTTP Range 請求的工作原理
請求頭 Range
客戶端通過在 HTTP 請求頭中添加?Range
?字段來指定所需的字節范圍。例如:
GET /file.zip HTTP/1.1
Host: example.com
Range: bytes=0-1023
上述請求表示客戶端只請求?file.zip
?文件的前 1024 個字節。
響應頭 Content-Range
服務器接收到帶有?Range
?請求頭的請求后,會返回一個包含?Content-Range
?響應頭的部分內容響應。例如:
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/2048
Content-Length: 1024
Content-Type: application/zip[文件的前1024個字節]
狀態碼?206 Partial Content
?表示這是部分內容響應。Content-Range
?頭字段指明了返回的數據范圍及整個文件的大小。
多部分范圍請求
HTTP Range 請求也支持請求多個不連續的范圍。這時,服務器會返回多部分內容,使用?multipart/byteranges
?作為?Content-Type
。
示例請求:
GET /file.zip HTTP/1.1
Host: example.com
Range: bytes=0-1023,2048-3071
示例響應:
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=BOUNDARY--BOUNDARY
Content-Range: bytes 0-1023/4096[文件的前1024個字節]
--BOUNDARY
Content-Range: bytes 2048-3071/4096[文件的第2048到3071個字節]
--BOUNDARY--
常見使用場景
- 斷點續傳:當下載大文件時,如果下載過程中斷,客戶端可以使用 Range 請求從中斷點繼續下載,而不必重新下載整個文件。
- 視頻流播放:視頻播放器可以根據播放進度按需請求視頻文件的不同部分,提高加載速度和用戶體驗。
- 按需加載:在處理大數據文件時,可以只請求需要處理的部分數據,減少內存和帶寬的使用。
代碼
?Python 的?requests
?庫實現 HTTP Range 請求的示例代碼:
import requestsurl = 'http://example.com/largefile.zip'
headers = {'Range': 'bytes=0-1023'}response = requests.get(url, headers=headers)if response.status_code == 206:with open('partial_file.zip', 'wb') as f:f.write(response.content)
else:print('請求失敗,狀態碼:', response.status_code)
?
支持情況
大多數現代瀏覽器、下載工具和服務器都支持 HTTP Range 請求。例如,Apache 和 Nginx 服務器可以處理 Range 請求,而瀏覽器如 Chrome、Firefox 等也可以發起 Range 請求。
配置服務器支持
在 Nginx 中支持 Range 請求通常是默認配置,但可以通過以下指令明確開啟:
server {listen 80;server_name example.com;location / {root /var/www/html;include /etc/nginx/mime.types;default_type application/octet-stream;# 啟用 Range 請求slice 1m;proxy_cache_range on;}
}