43

I have two locations in nginx config that work:

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ { proxy_pass http://backend.example.com; }

How can I combine these two into one location?

What I have done already:

I tried this suggestion

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

but it doesn't work for me.

Also, when I don't use backends, the following config is functioning properly:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

update (some strings from the log)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

SOLUTION

Actually my solution does work fine:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

and the issue has nothing to do with backends. As Guido Vaccarella correctly noticed it just followed after another location ~ ... that matched, so that my location ~ ... had no chance to run.

Vlad T.
  • 565

2 Answers2

41

According to nginx documentation:

Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used.

In your configuration, the following location is defined before the one with the proxy_pass and it matches the request of js and css files under static:

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

Unfortunately the "log_not_found off" clause disables the logging for any file-not-found error related to this location, that's why your error_log is empty!

You can try to comment out this location or move it after the location with the proxy_pass (if you need it for other files not in static / media).

20
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

Should be...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

The closing needs to be a brace {}, not a parenthesis bracket ().

Can't believe how long it took to see that. Guido was right from the comments.

Grumpy
  • 3,059