如何避免在 NGINX 中使用“Vary: Cookie”標頭進行瘋狂記憶體
我知道
Vary: Cookie
它不太受歡迎,因為它會導致記憶體使用者可能報告的每個 cookie 變體。另一方面,如果沒有它,我不得不Cache-Control: no-cache
告訴我的 NGINX 記憶體伺服器完全跳過可能有使用者登錄的記憶體內容(順便說一下,我網站的每個頁面,因為頂部有一個帳戶框這頁紙)。我只在使用者登錄時發送 cookie,因此大多數頁面視圖都會從記憶體中受益。我想縮小範圍,以便只有兩種變體:“差異”是沒有cookie 的使用者的記憶體版本和有 cookie 的使用者的非記憶體版本(例如,使用者已登錄並擁有身份驗證 cookie)。
如果我在我的 Perl 程序中添加“Vary: Cookie”,有沒有辦法告訴 NGINX 在這種情況下它應該只關注
sessionId
cookie 是否存在?類似於 - 製作偽標題 - 的東西Vary: Cookie('sessionId')
?如果有一種方法可以在 NGINX 會尊重的腳本生成的標頭中實現這一點,我想我更喜歡將它放在 NGINX 配置中,但任何解決方案都會受到讚賞。我不完全確定如何測試我是否會導致 NGINX 因記憶體而發瘋,但我想知道這些方面是否可行:在未登錄的查看器上,腳本發送
Vary: Cookie
,但在查看器上登錄後,它會發送該標頭和Cache-Control: no-cache
. NGINX 會理解這是告訴它記憶體第一個響應而不是變體嗎?或者我會以我現在沒有抓住的方式搞砸一些事情嗎?*更新:*這是我的一個伺服器塊的範例:
server { server_name myservername.tld listen 80; location / { proxy_cache $PROXY_CACHE; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; proxy_cache_use_stale error timeout http_429 http_500 http_502 http_503 http_504; proxy_cache_background_update on; proxy_cache_revalidate on; proxy_cache_min_uses 1; proxy_cache_lock on; proxy_pass $scheme://$APACHE_PROXY_REQ_IP:$APACHE_PROXY_REQ_PORT; } }
您應該查看指令
proxy_no_cache
和proxy_cache_bypass
.
proxy_no_cache
告訴 nginx 在什麼條件下它不應該記憶體來自您的應用程序的響應。您可以將其定義為您想要的任何內容,例如:proxy_no_cache $cookie_sessionid;
proxy_cache_bypass
在另一個方向上執行:它告訴 nginx 何時不應從記憶體中提供請求,而是將其傳遞給您的應用程序,即使存在記憶體條目也是如此。