Nginx

將 Nginx 反向代理記憶體標頭從公共更改為私有

  • February 21, 2020

我有一個 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;

}

我究竟做錯了什麼 ?還是有另一種方法來改變publicto private

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_secondsto$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
   ...
}

引用自:https://serverfault.com/questions/1003980