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

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

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

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 ~ ...没有机会运行。

答案1

根据nginx 文档

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

在您的配置中,以下位置在具有 proxy_pass 的位置之前定义,并且它与下的 js 和 css 文件的请求匹配静止的

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

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

您可以尝试注释掉此位置或将其移动到具有 proxy_pass 的位置之后(如果您需要它用于不在静止的/媒体)。

答案2

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

应该...

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

结尾需要用大括号 {},而不是圆括号 ()。

难以置信花了这么长时间才看到这个。从评论来看,Guido 是对的。

相关内容