一個拼寫錯誤讓整個互聯(lián)網(wǎng)一起犯錯
在 Web 開發(fā)的世界里,有這樣一個字段——它每天默默地工作著,記錄著用戶的來源,保護著網(wǎng)站的安全,卻因為一個歷史性的拼寫錯誤而成為了程序員們茶余飯后的談資。它就是 HTTP 頭部中的 Referer 字段。
什么是 HTTP Referer
HTTP Referer 是一個請求頭字段,用于告訴服務(wù)器用戶是從哪個頁面鏈接過來的。當你從一個網(wǎng)頁點擊鏈接跳轉(zhuǎn)到另一個網(wǎng)頁時,瀏覽器會自動在新的 HTTP 請求中添加 Referer 頭,其值為上一個頁面的 URL。
Referer: https://example.com/page1.html
這告訴服務(wù)器,用戶是從 https://www.example.com/page1.html 這個頁面跳轉(zhuǎn)過來的。
圖片
核心作用
1. 流量來源分析
網(wǎng)站運營者可以通過分析 Referer 信息了解:
- 用戶從哪些網(wǎng)站訪問過來
- 哪些頁面是主要的流量入口
- 外部鏈接的效果如何
- 用戶的瀏覽路徑和行為習慣
2. 防盜鏈保護
許多網(wǎng)站利用 Referer 來防止其他網(wǎng)站直接鏈接自己的圖片、視頻等資源。服務(wù)器可以檢查 Referer 是否來自允許的域名,如果不是則拒絕請求。
# nginx 圖片防盜鏈配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
valid_referers none blocked server_names
*.mysite.com *.mydomain.com;
if ($invalid_referer) {
return 403;
}
}
3. 安全防護
用于 CSRF 攻擊防護和惡意請求檢測:
# nginx CSRF 攻擊防護
location /api {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
proxy_pass http://backend;
}
這樣就可以檢查請求是否來自合法域名(*.example.com)。
著名的拼寫錯誤
圖片
HTTP Referer 存在一個著名的拼寫錯誤:正確的英文單詞應(yīng)該是 "Referrer",但在 1995 年制定 HTTP/1.0 規(guī)范時被誤寫為 "Referer"(少了一個 r)。
當錯誤被發(fā)現(xiàn)時,HTTP 協(xié)議已經(jīng)廣泛部署,為保持向后兼容性,這個拼寫錯誤被永久保留:
- HTTP 頭部:使用錯誤拼寫
Referer
- HTML 屬性:使用正確拼寫
referrer
<!-- HTML中使用正確拼寫 -->
<meta name="referrer" content="origin">
<!-- HTTP頭中使用錯誤拼寫 -->
Referer: https://example.com
Referrer-Policy 策略
為了解決隱私問題,W3C 制定了 Referrer Policy 規(guī)范,提供了精細的控制機制,現(xiàn)代瀏覽器支持 Referrer-Policy 來控制 Referer 的發(fā)送行為:
策略值
策略 | 描述 | 使用場景 |
| 不發(fā)送 Referer | 最高隱私保護 |
| HTTPS 到 HTTP 時不發(fā)送,其他情況正常發(fā)送 | 現(xiàn)代瀏覽器默認 |
| 只發(fā)送協(xié)議、域名和端口 | 平衡功能和隱私 |
| 同源發(fā)送完整 URL,跨域只發(fā)送域名 | 推薦的默認策略 |
| 僅同源請求發(fā)送 Referer | 內(nèi)部分析 |
| 類似 origin,但 HTTPS 到 HTTP 時不發(fā)送: | 較少 |
| 綜合考慮安全性的策略 | 現(xiàn)代瀏覽器默認 |
| 始終發(fā)送完整 URL | 較少 |
設(shè)置方法
HTTP 響應(yīng)頭:
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
HTML Meta 標簽:
<meta name="referrer" content="strict-origin-when-cross-origin">
元素級別控制:
<a referrerpolicy="no-referrer">外部鏈接</a>
<img src="image.jpg" referrerpolicy="origin">
rel 屬性相關(guān)值
noreferrer
阻止發(fā)送 Referer 頭:
<a rel="noreferrer">不發(fā)送Referer</a>
noopener
防止新窗口訪問原窗口對象:
<a target="_blank" rel="noopener">安全新窗口</a>
nofollow
告訴搜索引擎不要跟蹤鏈接:
<a rel="nofollow">不被索引的鏈接</a>
組合使用
<a
target="_blank"
rel="noopener noreferrer nofollow">
完全安全的外部鏈接
</a>
總結(jié)
HTTP Referer 雖然只是一個小小的請求頭,但它承載著 Web 發(fā)展的歷史,見證了互聯(lián)網(wǎng)從功能至上到隱私保護的轉(zhuǎn)變。那個著名的拼寫錯誤也提醒我們,技術(shù)標準的制定需要更加嚴謹和謹慎。