一個拼寫錯誤讓整個互聯網一起犯錯
在 Web 開發的世界里,有這樣一個字段——它每天默默地工作著,記錄著用戶的來源,保護著網站的安全,卻因為一個歷史性的拼寫錯誤而成為了程序員們茶余飯后的談資。它就是 HTTP 頭部中的 Referer 字段。
什么是 HTTP Referer
HTTP Referer 是一個請求頭字段,用于告訴服務器用戶是從哪個頁面鏈接過來的。當你從一個網頁點擊鏈接跳轉到另一個網頁時,瀏覽器會自動在新的 HTTP 請求中添加 Referer 頭,其值為上一個頁面的 URL。
Referer: https://example.com/page1.html
這告訴服務器,用戶是從 https://www.example.com/page1.html 這個頁面跳轉過來的。
圖片
核心作用
1. 流量來源分析
網站運營者可以通過分析 Referer 信息了解:
- 用戶從哪些網站訪問過來
- 哪些頁面是主要的流量入口
- 外部鏈接的效果如何
- 用戶的瀏覽路徑和行為習慣
2. 防盜鏈保護
許多網站利用 Referer 來防止其他網站直接鏈接自己的圖片、視頻等資源。服務器可以檢查 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 存在一個著名的拼寫錯誤:正確的英文單詞應該是 "Referrer",但在 1995 年制定 HTTP/1.0 規范時被誤寫為 "Referer"(少了一個 r)。
當錯誤被發現時,HTTP 協議已經廣泛部署,為保持向后兼容性,這個拼寫錯誤被永久保留:
- HTTP 頭部:使用錯誤拼寫
Referer
- HTML 屬性:使用正確拼寫
referrer
<!-- HTML中使用正確拼寫 -->
<meta name="referrer" content="origin">
<!-- HTTP頭中使用錯誤拼寫 -->
Referer: https://example.com
Referrer-Policy 策略
為了解決隱私問題,W3C 制定了 Referrer Policy 規范,提供了精細的控制機制,現代瀏覽器支持 Referrer-Policy 來控制 Referer 的發送行為:
策略值
策略 | 描述 | 使用場景 |
| 不發送 Referer | 最高隱私保護 |
| HTTPS 到 HTTP 時不發送,其他情況正常發送 | 現代瀏覽器默認 |
| 只發送協議、域名和端口 | 平衡功能和隱私 |
| 同源發送完整 URL,跨域只發送域名 | 推薦的默認策略 |
| 僅同源請求發送 Referer | 內部分析 |
| 類似 origin,但 HTTPS 到 HTTP 時不發送: | 較少 |
| 綜合考慮安全性的策略 | 現代瀏覽器默認 |
| 始終發送完整 URL | 較少 |
設置方法
HTTP 響應頭:
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 屬性相關值
noreferrer
阻止發送 Referer 頭:
<a rel="noreferrer">不發送Referer</a>
noopener
防止新窗口訪問原窗口對象:
<a target="_blank" rel="noopener">安全新窗口</a>
nofollow
告訴搜索引擎不要跟蹤鏈接:
<a rel="nofollow">不被索引的鏈接</a>
組合使用
<a
target="_blank"
rel="noopener noreferrer nofollow">
完全安全的外部鏈接
</a>
總結
HTTP Referer 雖然只是一個小小的請求頭,但它承載著 Web 發展的歷史,見證了互聯網從功能至上到隱私保護的轉變。那個著名的拼寫錯誤也提醒我們,技術標準的制定需要更加嚴謹和謹慎。