Nginx:多个路径的位置正则表达式


30

我在nginx config中有两个可以工作的位置:

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

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

如何将这两部分合并到一个位置?

我已经做了什么:

我尝试了这个建议

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

但这对我不起作用。

另外,当我不使用后端时,以下配置可以正常运行:

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

更新(日志中的一些字符串)

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$

实际上,我的解决方案工作正常:

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

这个问题与后端无关。正如Guido Vaccarella正确注意到的那样,它紧随其后才location ~ ...相匹配,所以我location ~ ...没有机会跑步。


我不明白您的正则表达式代理通行证为什么不起作用。尝试时会发生什么?
脾气暴躁的人,2013年

当我尝试它时,前端nginx抛出404错误。
Vlad T.

location语句末尾的)是您的问题中的错误还是配置文件中的错误?
Guido Vaccarella

您应该仔细检查配置的其余部分是否有错误。另外,可能想通过查看它的外观,缺少的内容来调查为什么抛出404。也有可能在找不到错误文件的地方抛出404,因此需要查看之前抛出的错误。
脾气暴躁的

请提供从错误日志中的错误
穆罕默德AbuShady

Answers:


30

根据nginx文档

然后按照在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配项上终止,并使用相应的配置。

在您的配置中,以下位置是在proxy_pass之前定义的,它与static下js和css文件的请求匹配:

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

不幸的是,“ log_not_found off”子句禁用了与该位置有关的任何文件未找到错误的日志记录,这就是为什么error_log为空!

您可以尝试使用proxy_pass注释掉该位置或将其移动到该位置之后(如果您需要用于非static / media以外的其他文件)。


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

应该...

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

结束符必须是大括号{},而不是括号()。

不敢相信花了多长时间。Guido的评论正确。


哦,很抱歉造成误解,我认为这是指|media)字符串中“ media”之后的括号以“ location”开头。但是这里错误的括号只是一个错字(已修正)。否则,将不会加载此nginx配置,并再次引发类似“ unexpected ")"...抱歉” 的错误。
Vlad T.14年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.