主题
location
在 Nginx 中,location 用于定义针对特定 URL 路径的处理规则。
location 匹配规则
匹配变量
Nginx 的 location 规则匹配的变量是 $uri
, 所以不用管后面的参数 $query_string
(或者 $args
)
匹配种类
nginx
location [空格 | = | ~ | ~* | ^~ | @ ] /uri/ {
...
}
上面分为三部分:
- 最前面的字符 (location modifier) 匹配规则
- 后面 uri 的匹配规则 (location match)
- 大括号内的路由转发
modifier(修饰符)
格式:[空格 | = | ~ | ~* | ^~ | @ ]
详细解释:
字符 | 解释 |
---|---|
空格 | 如果直接是一个空格,那就是不写 location modifier ,Nginx 仍然能去匹配 pattern 。这种情况下,匹配那些以指定的 patern 开头的 URI,注意这里的 URI 只能是普通字符串,不能使用正则表达式。 |
= | 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。 |
~ | 表示执行一个正则匹配,区分大小写匹配 |
~\* | 表示执行一个正则匹配,不区分大小写匹配, 注意,如果是运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么 ~* 和 ~ 这两个表现是一样的 |
^~ | 即表示只匹配普通字符(跟空格类似,但是它优先级比空格高)。使用前缀匹配,^表示“非”,即不查询正则表达式。如果匹配成功,并且所匹配的字符串是最长的, 则不再匹配其他 location。 |
@ | 用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files 或 error_page |
匹配优先级(从高到低)
=
^~
~/~*
空格
需要注意的细节:
- 常规字符串匹配类型。是按前缀匹配(从根开始)。 而正则匹配是包含匹配,只要包含就可以匹配
~
和~*
的优先级一样,取决于在配置文件中的位置,最上面的为主,跟匹配的字符串长度没关系,所以在写的时候,应该越精准的要放在越前面才对空格
和^~
都是字符串匹配,所以如果两个后面的匹配字符串一样,是会报错的,因为 nginx 会认为两者的匹配规则一致,所以会有冲突^~
,=
,~
,~*
这些修饰符和后面的 URI 字符串中间可以不使用空格隔开(大部分都是用空格隔开)。但是@
修饰符必须和 URI 字符串直接连接