禁用JavaScript文件的nginx缓存

时间:2016-10-25 15:13:46

标签: javascript caching nginx

好的,我几乎放弃了这个,但是如何禁用Nginx对JavaScript文件的缓存?我正在使用Nginx的docker容器。当我现在在JavaScript文件中更改某些内容时,我需要多次重新加载,直到新文件存在。

我怎么知道它是Nginx而不是浏览器/泊坞窗?

浏览器:我在命令行上使用了curl来模拟请求并遇到了同样的问题。此外,我正在使用CacheKiller插件并在Chrome开发工具中禁用缓存。

Docker:当我连接到容器的bash,并在更改文件后使用cat时,我会立即得到正确的结果。

我将nginx.conf的{​​{1}}更改为此(我在另一个stackoverflow线程中找到)

sites-enabled

然而,在重建容器(并确保它在容器中location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|xml|html|htm)$ { # clear all access_log directives for the current level access_log off; add_header Cache-Control no-cache; # set the Expires header to 31 December 2037 23:59:59 GMT, and the Cache-Control max-age to 10 years expires 1s; } )之后,它仍然无效。这是完整的cat

.conf

6 个答案:

答案 0 :(得分:52)

我有以下nginx虚拟主机(静态内容)用于本地开发工作以禁用所有浏览器缓存:

server {
    listen 8080;
    server_name localhost;

    location / {
        root /your/site/public;
        index index.html;

        # kill cache
        add_header Last-Modified $date_gmt;
        add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
        if_modified_since off;
        expires off;
        etag off;
    }
}

没有发送缓存标头:

$ curl -I http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Mon, 24 Jul 2017 16:19:30 GMT
Content-Type: text/html
Content-Length: 2076
Connection: keep-alive
Last-Modified: Monday, 24-Jul-2017 16:19:30 GMT
Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0
Accept-Ranges: bytes

Last-Modified始终是当前时间。

答案 1 :(得分:18)

expiresadd_header指令对NGINX缓存文件没有影响,这些只是浏览器看到的内容。

您可能需要的是:

location stuffyoudontwanttocache {
    # don't cache it
    proxy_no_cache 1;
    # even if cached, don't try to use it
    proxy_cache_bypass 1; 
}

虽然通常.js等是你要缓存的东西,所以也许你应该完全禁用缓存?

答案 2 :(得分:7)

您正在寻找的是一个简单的指令,如:

location ~* \.(?:manifest|appcache|html?|xml|json)$ {
    expires -1;
}

以上内容不会缓存()中的扩展名。您可以为不同的文件类型配置不同的指令。

答案 3 :(得分:2)

请记住设置.as-console-wrapper { top: 0; max-height: 100% !important;}或缓存标头不起作用。 我用这个剪断了:

sendfile off;

答案 4 :(得分:2)

我有以下Nginx虚拟主机(静态内容)用于本地开发工作以禁用所有浏览器缓存:

    upstream testCom
        {
         server localhost:1338;
        }

    server
        {

            listen 80;
            server_name <your ip or domain>;
            location / {

            # proxy_cache   datacache;
            proxy_cache_key $scheme$host$request_method$request_uri;
            proxy_cache_valid       200     60m;
            proxy_cache_min_uses    1;
            proxy_cache_use_stale   updating;

            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Scheme $scheme;

            proxy_ignore_headers    Set-Cookie;

            userid          on;
            userid_name     __uid;
            userid_domain   <your ip or domain>;
            userid_path     /;
            userid_expires  max;
            userid_p3p      'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';


            add_header Last-Modified $date_gmt;
            add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
            if_modified_since off;
            expires off;
            etag off;

            proxy_pass http://testCom;
        }
    }

答案 5 :(得分:0)

我知道这个问题有点老了,但我建议在JavaScript的网址中使用一些cachebraking哈希。这在生产和开发过程中均能完美发挥作用,因为更改时您可以拥有无​​限的缓存时间和完整的更新。

假设您有一个javascript文件 /js/script.min.js , 但在引用html / php文件中,您不使用实际路径,而是:

<script src="/js/script.<?php echo md5(filemtime('/js/script.min.js')); ?>.min.js"></script>

因此,每次更改文件时,浏览器都会获得一个不同的url,这又意味着它无法缓存,无论是在本地还是在两者之间的任何代理上。

要执行此操作,您需要nginx将对/js/script.[0-9a-f]{32}.min.js的任何请求重写为原始文件名。就我而言,我使用以下指令(也适用于CSS):

location ~* \.(css|js)$ {
                expires max;
                add_header Pragma public;
                etag off;
                add_header Cache-Control "public";
                add_header Last-Modified "";
                rewrite  "^/(.*)\/(style|script)\.min\.([\d\w]{32})\.(js|css)$" /$1/$2.min.$4 break;
        }

我猜想filemtime调用甚至不需要在服务器上进行磁盘访问,因为它应该在linux的文件缓存中。如果您有疑问或静态html文件,还可以使用固定的随机值(或增量或内容哈希),该值会在javascript / css预处理器完成后更新,或者让您的git挂钩之一对其进行更改。

理论上,您也可以将cachebreaker用作虚拟参数(例如/js/script.min.js?cachebreak=0123456789abcfef),但是由于“ ”。