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

Vla*_* T. 39 nginx regex

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

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

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}
Run Code Online (Sandbox Code Playgroud)

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

我已经做了什么:

我试过这个建议

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}
Run Code Online (Sandbox Code Playgroud)

但这对我不起作用。

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

location ~ ^/(static|media)/ {
  root /home/project_root;
}
Run Code Online (Sandbox Code Playgroud)

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

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$
Run Code Online (Sandbox Code Playgroud)

解决方案

其实我的解决方案确实工作正常:

location ~ ^/(static|media)/ {
  root /home/project_root;
}
Run Code Online (Sandbox Code Playgroud)

这个问题与后端无关。由于 Guido Vaccarella 正确地注意到它只是一个接一个location ~ ... 匹配,所以我location ~ ...没有机会跑。

Gui*_*lla 39

根据nginx 文档

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

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

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

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

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


Gru*_*mpy 18

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

应该...

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

结束需要是大括号 {},而不是括号 ()。

不敢相信花了多长时间才看到。从评论来看,Guido 是对的。