我的團隊使用 nginx快取。問題是上游的應用程式發送了一些我們想要覆蓋的標頭在快取的物件中。如果在快取中搜尋鍵(或鍵的一部分),則可以看到儲存在快取物件中的標頭。例如
cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches
然後可以做
strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on
nginx 設定是(簡化的)
# part of server1
location / {
proxy_pass http://upstream;
proxy_cache zone1;
}
現在我知道了該指令proxy_hide_header
,我曾經嘗試刪除(並替換)快取物件中的標頭,但它不起作用。感覺流程大概是這樣的:
- 上游發送回應
- nginx 讀取回應
- 響應保存在快取中的檔案中
- 對回應執行操作(例如刪除標頭)以將回應傳送至客戶端
因此,在將回應保存到快取中之前,似乎沒有辦法影響回應的標頭。
我可以開發的一種解決方法是簡單地將另一個 nginx 伺服器放在中間,以便它可以更改標頭,然後將其保存在server1
.
例子
# part of server1
location /
proxy_pass http://upstream-modify-headers;
proxy_set_header Host modify.headers;
proxy_cache zone1;
}
# the upstream
upstream upstream-modify-headers {
server 127.0.0.1:80;
}
#the host that modifies the headers
server {
listen *:80;
server_name modify.headers;
add_header "cache-control" "public, max-age=10, must-revalidate";
...
location / {
proxy_pass http://upstream;
proxy_hide_header cache-control; #one example header that should be modified in the cache
}
...
allow 127.0.0.1; #only locally available
}
這可行,但需要額外的 nginx 主機。是否可以在同一 nginx 伺服器內覆蓋快取物件中的標頭,而無需在上游新增額外的標頭?
答案1
看來您正在尋找proxy_hide_header
指令。
答案2
作為解決方法,請嘗試在標題上新增日期戳記。新增後,您將能夠區分哪些標頭來自緩存,哪些標頭是新的(透過在訪問日誌中與其他時間戳進行比較)