nginx可以对同一个请求穿越多个位置吗?

问题描述 投票:0回答:1

我偶然遇到了这个。我的 nginx 配置中有两个位置块:

location /static/ {
        alias /app/static/;
}

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
}

第二个是错误地从旧配置复制粘贴的。我遇到的问题是我的图像没有被提供,通过打开 nginx 调试并查看它,nginx 匹配了图像文件的第二个

location
块(位于
/static
树中),并且然后停止处理并尝试从根路径加载它 - 但失败了。

那么,有没有办法既拥有一个有效的

/static
位置别名(或者实际上多个这样的别名),又拥有一些仅适用于某些文件扩展名的规则?

我可以在

/static
位置移动图像匹配规则,但是如果我有十几个这样的别名并且我想向所有别名添加一些特殊的图像规则怎么办?我可以告诉 nginx 继续查找,即使它符合位置规则吗?

nginx
1个回答
0
投票

Nginx 选择单个

location
处理当前请求

您当前的配置可以进行如下改进:

location ^~ /static/ {
  root /app;
  location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    access_log off; log_not_found off; expires max;
  }
}

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
  access_log off; log_not_found off; expires max;
}

使用

^~
,以便前缀位置 优先于 于正则表达式位置。

应尽可能使用

root
语句代替
alias
,如 此处所示

并且,正如您所建议的,位置块可以嵌套。


如果您有许多位置具有不同的

root
alias
,您可以使用
include
语句将相同的代码段拉入配置中的多个点。


或者,

access_log
expires
指令都接受变量,示例如下所示herehere

因此,逻辑应用于

http
server
上下文中的原始陈述。

您需要两张地图,都用如下模式测试

$request_uri

~*\.(ogg|ogv|svg...wav|bmp|rtf)(\?|$)

跳过中间部分是为了更好地看到图案的结尾。


据我所知,

log_not_found
不接受变量。

该指令控制 Nginx 写入其错误日志的内容。如果您需要抑制 404 响应,同时在错误日志中生成“找不到文件”条目,请使用: try_files $uri $uri/ =404;

在相应的
location
块中,这与默认行为

类似

,但会禁止将 
找不到文件 错误写入错误日志。

© www.soinside.com 2019 - 2024. All rights reserved.