Nginx的location配置,用于定义请求的URI和服务器响应之间的对应关系。
location语法
Nginx的location规则匹配的是URI, 不需要考虑后面的query_string。语法如下:
1 | location [ = | ~ | ~* | ^~ | 空格 ] /URI { |
location modifier的解释
参数 | 解释 |
---|---|
= | 精确匹配, 如匹配成功就立即停止搜索 |
^~ | 前缀匹配, 不使用正则表达式。如果匹配成功, 并且匹配字符串是最长的,就不再匹配其他location |
~ | 正则匹配,区分大小写 |
~* | 正则匹配,不区分大小写 |
空格 | 前缀匹配, 不使用正则表达式 |
location modifier的匹配顺序
- 先精确匹配
=
,如精确匹配成功会立刻停止搜索 - 再前缀匹配(
^~
和空格), 如果匹配最长的结果是^~
, 立刻停止搜索; 否则暂存匹配最长的结果(空格),继续往下走 - 查找正则匹配(
'~'
和'~*'
), 如果同时有多个正则匹配,按配置文件中定义的先后顺序,优先取配置文件中最上面的,立刻停止搜索;否则往下走 - 返回第2步保存的结果(匹配最长的空格匹配)
官方文档的描述: http://nginx.org/en/docs/http/ngx_http_core_module.html#location
以下通过几个示例加深理解
示例
例1(Nginx官方文档的例子):
1 | location = / { |
测试结果:
1 | curl localhost/ |
解释: 对于localhost/documents/1.jpg
, 前缀匹配最长结果为空格匹配/documents/
, 所以继续正则匹配, 正则匹配命中location ~* \.(gif|jpg|jpeg)$
,所以返回5
例2:
1 | location /document { |
测试结果
1 | curl localhost/document |
解释: 前缀匹配的结果为空格匹配, 所以继续执行正则匹配, 正则匹配可以命中,所以返回2
例3
1 | location ^~ /doc { |
测试结果
1 | curl localhost/document |
解释: ^~
前缀匹配命中后,立刻停止搜索,不会进行正则匹配, 所以返回1
例4
1 | location ~ ^/document { |
测试结果
1 | curl localhost/document2 |
解释: 正则匹配是按照配置文件中定义的顺序,先匹配成功的返回,所以返回1
例5
1 | location /images/1.jpg { |
测试:
1 | curl localhost/images/1.png |
解释:
- 对于第1个
/images/1.png
,前缀匹配最长的是空格(第1个location), 所以继续正则匹配; 正则匹配可以命中第3个和第4个,取最上面那个,所以返回3 - 对于第2个
/images/1
,最长的前缀匹配为^~
(第2个location),所以直接返回2
location 实际使用
实际使用中,要避免出现上述示例中混乱的配置;可以先放置精确匹配,再前缀匹配,最后是正则匹配
1 | server { |
参考
【1】https://juejin.cn/post/6908623305129852942
【2】https://juejin.cn/post/7048952689601806366