Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
84
rated 0 times [  86] [ 2]  / answers: 1 / hits: 154192  / 8 Years ago, tue, october 25, 2016, 12:00:00

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

More From » caching

 Answers
58

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).


To disable caching for a particular file extension (e.g. JS as requested by the OP):


location ~* .js$ {
expires -1;
}

See Nitai's answer below to expand the list of file extensions - using a non-capturing group regex pattern.


[#60280] Sunday, October 23, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jarod

Total Points: 62
Total Questions: 111
Total Answers: 83

Location: Saint Vincent and the Grenadines
Member since Sat, Sep 11, 2021
3 Years ago
jarod questions
;