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; }
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.
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.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With