18

我正在尝试优化我的“位置”指令,但找不到确定是否尝试特定位置匹配的好方法。在 location 块内使用echo在这里没有帮助。

NGINX ngx_http_core_module 文档有些混乱。

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

  1. ~对于区分大小写的匹配

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

比赛如何进行:

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

  2. 所有剩余的带有常规字符串的指令。如果此匹配使用了^~前缀,则搜索停止。

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

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

此处的数字 2 表示“常规字符串”,但随后表示它可以与^~前缀一起使用。并不~意味着正则表达式?如果不是,它如何确定什么是非正则表达式?

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

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

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

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

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

我有:

location ^~ /assets {}      # search-terminating literal? or regex?
location ~ \.php$|/$ {}
location / {}               # is this match always attempted?

从文档来看,实际顺序似乎是 1-3-2,始终运行文字/匹配。是的,这种优化不会对实际性能产生任何影响,但我只是想澄清一些歧义。

4

1 回答 1

8

来自维基:

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 ] 
}

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

即使资产是由location / {}

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

if ($uri ~* "^/uploads/") {
  return 404;
}

如您所见,nginx 的工作方式与您预期的略有不同。

于 2011-12-09T02:19:58.110 回答