如何控制NGINX'Location'指令匹配顺序?

lee*_*iya 17 nginx url-rewriting nginx-location

我正在尝试优化我的"位置"指令,并且找不到确定是否尝试特定位置匹配的好方法.使用echo位置块内不帮助这里.

NGINX ngx_http_core_module文档有点令人困惑.

要使用正则表达式,必须使用前缀:

  1. ~ 区分大小写的匹配

  2. ~* 对于不区分大小写的匹配

如何进行比赛:

  1. 具有=与查询完全匹配的前缀的指令.如果找到,搜索停止.

  2. 所有剩余的指令与传统的字符串.如果此匹配使用^~前缀,则搜索停止.

  3. 正则表达式,按照在配置文件中定义的顺序.

  4. 如果#3产生匹配,则使用该结果.否则,使用#2的匹配.

这里的数字2表示"常规字符串",但后来说它可以与^~前缀一起使用.并不~意味着RegExp?如果没有,它如何确定什么不是RegExp?

具体来说,我想要以下内容:

  1. /assets直接提供任何文字.停止搜索.

  2. \.php$|/$通过快速CGI STOP SEARCH提供与RegExp匹配的任何内容.

  3. 通过文字直接提供其他所有内容 /

这样,只有/匹配尝试从资源外部提供的非动态文件.

我有:

location ^~ /assets {}      # search-terminating literal? or regex?
location ~ \.php$|/$ {}
location / {}               # is this match always attempted?
Run Code Online (Sandbox Code Playgroud)

从文档中,看起来实际的顺序是1-3-2,始终运行文字/匹配.是的,这种优化不会对实际性能产生任何影响,但我只是想澄清一些含糊之处.

m33*_*lky 7

来自维基:

location  = / {
  # matches the query / only.
  [ configuration A ] 
}
location  / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be
  # matched first.
  [ configuration B ] 
}
Run Code Online (Sandbox Code Playgroud)

所以,这将首先匹配: location ~ \.php$ {}

即使资产是由服务提供的 location / {}

在php块中你还希望在传递给fastcgi之前防止恶意上传:

if ($uri ~* "^/uploads/") {
  return 404;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,nginx的工作方式与您预期的有所不同.