Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable nginx cache for JavaScript files

Ok, I'm almost giving up on this, but how can I disable the caching from Nginx for JavaScript files? I'm using a docker container with Nginx. When I now change something in the JavaScript file, I need multiple reloads until the new file is there.

How do I know it's Nginx and not the browser/docker?

Browser: I used curl on the command line to simulate the request and had the same issues. Also, I'm using a CacheKiller plugin and have cache disabled in Chrome Dev Tools.

Docker: When I connect to the container's bash, and use cat after changing the file, I get the correct result immediately.

I changed my nginx.conf for the sites-enabled to this (which I found in another stackoverflow thread)

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; } 

However, after rebuilding the containers (and making sure it's in the container with cat), it still didn't work. This here is the complete .conf

server {     server_name app;     root /var/www/app/web;      # Redirect to blog     location ~* ^/blog {         proxy_set_header Accept-Encoding "";         sub_filter 'https://testproject.wordpress.com/' '/blog/';         sub_filter_once off;         rewrite ^/blog/(.*) /$1 break;         rewrite ^/blog / break;         proxy_pass     https://testproject.wordpress.com;     }      # Serve index.html only for exact root URL     location / {         try_files $uri /app_dev.php$is_args$args;     }      location ~ ^/(app|app_dev|config)\.php(/|$) {         fastcgi_pass php-upstream;         fastcgi_split_path_info ^(.+\.php)(/.*)$;         include fastcgi_params;         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;         fastcgi_param HTTPS off;         # Prevents URIs that include the front controller. This will 404:         # http://domain.tld/app_dev.php/some-path         # Remove the internal directive to allow URIs like this         internal;     }      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;     }       error_log /var/log/nginx/app_error.log;     access_log /var/log/nginx/app_access.log; } 
like image 292
Musterknabe Avatar asked Oct 25 '16 15:10

Musterknabe


People also ask

Does nginx cache by default?

By default, NGINX Plus caches all responses to requests made with the HTTP GET and HEAD methods the first time such responses are received from a proxied server. As the key (identifier) for a request, NGINX Plus uses the request string.

Are .JS files cached in browser?

JavaScript and CSS files are usually cached in the browser after the first access. The browser cache is used to store web application assets like images, CSS, and JS code on your computer's hard drive.


1 Answers

I have the following nginx virtual host (static content) for local development work to disable all browser caching:

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';         if_modified_since off;         expires off;         etag off;     } } 

No cache headers sent:

$ 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 Accept-Ranges: bytes 

Last-Modified is always current time.

Note: nginx's $date_gmt format is not per the HTTP spec (see changing the format).

like image 157
Greg K Avatar answered Oct 03 '22 07:10

Greg K