簡體   English   中英

nginx proxy_cache 密鑰散列在每個其他瀏覽器請求上發生變化

[英]nginx proxy_cache key hash change on each another browser request

我正在創建 nginx 的配置,例如:

proxy_cache_path /tmp/nginx/static levels=1:2 keys_zone=static_zone:10m inactive=10d use_temp_path$
proxy_cache_key "$request_uri$args";

location ~* \.(css|gif|ico|jpe?g|js(on)?|png|svg|webp|ttf|woff|woff2|txt|map)$ {
            proxy_hide_header Date;
            proxy_cache_revalidate on;
            proxy_pass http://static:8080;
            proxy_cache_bypass $cookie_nocache $arg_nocache;
            proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
            proxy_hide_header "Set-Cookie";
            proxy_buffering on;
            proxy_cache static_zone;

            proxy_cache_valid 200 301 302 30m;
            proxy_cache_valid 404 10m;
            #expires max;
            add_header X-Proxy-Cache $upstream_cache_status;

            access_log      off;
            add_header      Cache-Control   "public";
            add_header      Pragma          "public";
            expires         30d;
            log_not_found   off;
            tcp_nodelay     off;
}

在來自 Chrome 的第一個請求中,除了 x-proxy-cache:MISS 之外,其他請求都是從磁盤緩存中獲得的,頭為 x-proxy-cache:HIT。 刷新后也是命中。 但是當我在這台機器上從其他瀏覽器(Opera,Edge)打開頁面時,這個請求是 MISS。 在文件系統 nginx 中,在同一內容上創建兩個具有不同 md5sum 哈希的文件。 例如文件名 438476ac40665c852d3acde1acf769f1 頭:

^C^@^@^@^@^@^@^@/^V
W^@^@^@^@��^CW^@^@^@^@'^O
W^@^@^@^@m�,�^@^@�^@�^A^N"5703e3a7-67e"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
KEY: /js/catalog.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 15:07:19 GMT
Content-Type: application/javascript
Content-Length: 1662
Last-Modified: Tue, 05 Apr 2016 16:11:19 GMT
Connection: close
Vary: Accept-Encoding
ETag: "5703e3a7-67e"
Accept-Ranges: bytes

第二個文件名 a6f57423c2220fba3ada5f516f6dd91c 具有相同的內容和這個頭:

^C^@^@^@^@^@^@^@        ^V
W^@^@^@^@��^CW^@^@^@^@^A^O
W^@^@^@^@m�,�^@^@�^@�^A^N"5703e3a7-67e"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
KEY: /js/catalog.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 15:06:41 GMT
Content-Type: application/javascript
Content-Length: 1662
Last-Modified: Tue, 05 Apr 2016 16:11:19 GMT
Connection: close
Vary: Accept-Encoding
ETag: "5703e3a7-67e"
Accept-Ranges: bytes

根據文檔,文件名必須是 key 中的 md5,並且有echo -n '/js/catalog.js'| md5sum是 a6f57423c2220fba3ada5f516f6dd91c 作為其中一個文件的名稱(這是第一個請求)。 我不想為每個用戶|瀏覽器緩存在服務器 js|css 中。 只需緩存一次並從緩存中接收所有用戶的請求。 PS 我的網站使用 https、http2、nginx 1.9.14 版本。

基於那里的Vary: Accept-Encoding標頭,我猜想 Edge 和 Opera 會為請求發送不同的“Accept-Encoding”標頭。 例如,一個可能簡單地發送“gzip”,而另一個發送“gzip, deflate”。 這些是技術上不同的 Accept-Encoding請求標頭。

如果您知道源不會發送在瀏覽器之間不起作用的有意義的不同編碼,您可以添加:

proxy_ignore_headers Vary;

您已經擁有 proxy_ignore_headers,因此您可以添加它。

由於所有主要瀏覽器都支持 gzip,因此風險可能非常低。 但是,“webp”也是通過 Accept-Encoding 完成的,因此如果原點可以處理 webp,則可能會為某些圖像產生令人驚訝的結果。

TLDR:請求頭Accept-Encoding重要。


考慮它的正常值: Accept-Encoding: gzip, deflate, br

當您將其更改為Accept-Encoding: gzip, deflate, lolkek Nginx 會將緩存的響應存儲在不同的文件中。 這兩個文件(在 /var/cache/nginx/ 下)內容相同但名稱不同。

同樣的問題: https : //trac.nginx.org/nginx/ticket/1840

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM