Nginx
將 Nginx 反向代理記憶體標頭從公共更改為私有
我有一個 Nginx 記憶體伺服器從源伺服器獲取內容,源伺服器設置
Cache-Control
為,Public
因此我的 Nginx 記憶體伺服器可以記憶體內容並減少對源的請求。但是在為使用者提供服務時,我不希望它再發送記憶體Public
,而是將其設置為Private
其他人(在此網路之外)無法記憶體或修改它。我仍然需要它通過 max-age 並嘗試通過發送的自定義標頭來做到這一點,但
if
條件失敗。僅此一項就可以了:
add_header Cache-Control "private, max-age=$upstream_http_adr_private_cache_seconds";
這種情況失敗
if ($upstream_http_adr_private_cache_seconds) { add_header Cache-Control "private, max-age=$upstream_http_adr_private_cache_seconds"; }
但是這個測試也失敗了:
if ($upstream_http_adr_private_cache_seconds) { return 404; }
我究竟做錯了什麼 ?還是有另一種方法來改變
public
toprivate
?
ngx_http_rewrite_module
在評估$upstream_...
變數之前處理來自的指令。您不應將 nginx 配置視為程式語言,您的操作在原始碼中出現時按順序執行。例如,無論您是在它之前還是之後使用proxy_set_header
指令。proxy_pass
來自的指令ngx_http_rewrite_module
是一個特殊的故事,它們不同於任何其他指令,您可以在此處閱讀一些詳細資訊。對於您的情況,您可以使用
map
翻譯:map $upstream_http_adr_private_cache_seconds $cache_control { "" ""; # empty string if no custom header present default "private, max-age=$upstream_http_adr_private_cache_seconds"; } ... server { ... add_header Cache-Control $cache_control; ... }
如果
$upstream_http_adr_private_cache_seconds
to$cache_control
轉換的結果是一個空字元串,那麼 nginx 根本不會設置 Cache-Control(或者當一個空值作為 add_header 指令的參數值傳遞時的任何其他 HTTP 標頭)。更新
OP問了額外的問題:
如果一個
Cache-Control: public
標頭已經存在,那麼兩個標頭都保留(一個public
,一個private
),有沒有辦法僅在找到自定義標頭時刪除公共標頭?這是解決方案:
map $upstream_http_adr_private_cache_seconds $cache_control { "" $upstream_http_cache_control; # use original upstream Cache-Control header if no custom header is given default "private, max-age=$upstream_http_adr_private_cache_seconds"; } ... server { ... proxy_hide_header Cache-Control; # clear Cache-Control header that came from upstream add_header Cache-Control $cache_control; # set Cache-Control header again ... }