nginx Location 官网文档

语法

语法介绍

location [=|~|~*|^~|@] uri { ... }
location @name { ... }

一个 location 关键字,后面跟着可选的修饰符(就是[]中间的正则),后面是要匹配的字符,花括号中是要执行的操作。

  • =:表示精确匹配
  • ~:表示区分大小写正则匹配
  • ~*:表示不区分大小写正则匹配
  • ^~:表示 URI 以某个常规字符串开头
  • !~:表示区分大小写正则不匹配
  • !~*:表示不区分大小写正则不匹配
  • /:通用匹配,任何请求都会匹配到

匹配顺序

多个 location 配置的情况下,匹配顺序如下:

1、首先精确匹配=

location = /abcd {[…]
}
  • website.com/abcd:匹配
  • website.com/ABCD:可能会匹配,也可以不匹配,取决于操作系统的文件系统是否大小写敏感。Mac 默认是大小写不敏感,Windows 不区分大小,Linux 区分大小写。
  • website.com/abcd?param1&param2:匹配,忽略 querystring
  • website.com/abcd/:不匹配,带有结尾的/
  • website.com/abcde:不匹配

所以经常请求/的话,可以使用=来定义 location。

2、其次前缀匹配^~

如果该 location 是最佳的匹配,那么对于匹配这个 location 的字符串,立刻停止后续的正则搜索。注意,这不是一个正则表达式匹配,它的目的是优先于正则表达式的匹配。

3、接着是按文件中顺序的正则匹配(regular expression),如~~*

location ~ ^/abcd$ {[…]
}

^/abcd$这个正则表达式表示字符串必须以/开始,以$结束,中间必须是abcd

  • website.com/abcd:匹配(完全匹配)
  • website.com/ABCD:不匹配,大小写敏感
  • website.com/abcd?param1&param2:匹配
  • website.com/abcd/:不匹配,不能匹配正则表达式
  • website.com/abcde:不匹配,不能匹配正则表达式

4、最后是匹配不带任何修饰的前缀匹配(prefix string)

检查使用前缀字符串的 locations,在使用前缀字符串的 locations 中选择最长匹配的来匹配。

server {location /doc {[ configuration A ]}location /docu {[ configuration B ]}
}

/document能匹配上面 2 个,但前缀字符串顺序不重要,按照匹配长度来确定,所以最终匹配到B

小结,匹配顺序就是先=^~,然后是正则,最后是前缀字符串匹配。如果上述规则不好理解,可以看下面的伪代码

function match(uri):rv = NULLif uri in exact_match:return exact_match[uri]if uri in prefix_match:if prefix_match[uri] is '^~':return prefix_match[uri]else:rv = prefix_match[uri] // 注意这里没有 return,且这里是最长匹配if uri in regex_match:return regex_match[uri] // 按文件中顺序,找到即返回return rv

@name 的用法

@用来定义一个命名 location。主要用于内部重定向,不能用来处理正常的请求。其用法如下:

location / {try_files $uri $uri/ @custom
}
location @custom {# ...do something
}

上例中,当尝试访问 url 找不到对应的文件就重定向到我们自定义的命名 location(此处为 custom)。

注意,命名 location 中不能再嵌套其它的命名 location。

常用配置规则

1、精确匹配

# 将所有请求直接转发给服务器的9090端口
location = / {proxy_pass http://127.0.0.1:9090/;
}

2、处理静态文件

# 目录匹配
location ^~ /static/ {root /webroot/static/;
}# 后缀匹配
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}

3、转发动态请求到后端应用服务器

# 将/account/开始的请求转发给Account服务器
location /account/ {proxy_pass http://127.0.0.1:8080/
}# 将/order/开始的请求转发给Order服务器
location /order/ {proxy_pass http://127.0.0.1:9090/
}

URL 尾部的/需不需要

URL 尾部是否需要带/,也是我入门 nginx 经常搞错的。

1、location 中的字符有无/,都没有影响

也就是说/user//user是一样的,除非 location 中带了$对 url 有要求,可参考前面例子。

2、URL 结构是https://domain.com/的形式,尾部有没有/都不会造成重定向。

因为浏览器在发起请求的时候,默认加上了/,不过很多浏览器在地址栏里也不会显示/

3、如果 URL 的结构是https://domain.com/some-dir/,尾部如果缺少/将导致重定向。

因为根据约定,URL 尾部的/表示目录,没有/表示文件。所以访问/some-dir/时,服务器会自动去该目录下找对应的默认文件。如果访问/some-dir 的话,服务器会先去找 some-dir 文件,找不到的话会将 some-dir 当成目录,重定向到/some-dir/,去该目录下找默认文件。

root 与 alias

nginx 指定文件路径有两种方式 root 和 alias,主要区别在于 nginx 如何解释 location 后面的 uri,这会使两者分别以不同的方式将请求映射到服务器文件上。它们的使用方法和作用域:

[root]
语法:root path
默认值:root html
配置段:http、server、location、if
处理结果:root 路径+ location 路径

[alias]
语法:alias path
配置段:location
处理结果:使用 alias 路径替换 location 路径

如果一个请求的 URI 是/t/a.html 时,它们表现如下:

# 返回/www/root/html/t/a.html的文件
location ^~ /t/ {root /www/root/html/;
}# 返回/www/root/html/new_t/a.html的文件
# 把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
location ^~ /t/ {alias /www/root/html/new_t/;
}

可以看出 alias 是一个目录别名的定义,root 则是最上层目录的定义。另外 alias 后面必须要用/结束,否则会找不到文件的,而 root 则可有可无。

那如果 server 和 location 中都出现 root,是怎样的优先级呢??

http {server {listen 80;server_name www.abc.com;root /home/www/website/;location / {root /home/www/ts/;index index.html;}}
}

简单的来说是就近原则,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,当 location 中匹配不到的时候,则使用 server 中的 root 配置。


参考资料:

  • Nginx 正则配置
  • 彻底弄懂 Nginx location 匹配
  • 一份简单够用的 Nginx Location 配置讲解
  • 一文弄懂 Nginx 的 location 匹配
  • nginx 中 location 和 root,你确定真的明白他们关系?
  • 大小写敏感知多少

Nginx之Location相关推荐

  1. nginx之location匹配规则

    Nginx之location 匹配规则详解 有些童鞋的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是" ...

  2. Nginx之location 匹配规则详解

    Nginx 的语法形式是: location [=|~|~*|^~|@] /uri/ { - } ,意思是可以以" = "或" ~* "或" ~ &q ...

  3. nginx location匹配优先级_一分钟搞清楚:Nginx之Location优先级

    Location表达式类型 ~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location = 进行 ...

  4. Nginx的location配置详解

    Nginx的location配置详解 匹配顺序 location 的匹配顺序其实是先匹配普通,再匹配正则 正则匹配会覆盖普通匹配(实际的规则,比这复杂) 执行顺序 普通 location的匹配规则是& ...

  5. Nginx 的 Location 配置指令块

    最近一段时间在学习 Nginx ,以前一直对 Nginx 的 Location 配置很头大,最近终于弄出点眉目.总结如下: nginx 配置文件,自下到上分为三种层次分明的结构:  |    http ...

  6. Nginx配置location及rewrite规则

    Nginx配置location及rewrite规则 示例: location  = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location ...

  7. Nginx之location详解

    root location中root指定的只是相对路径,需要和路径结合起来映射地址,比如 location ^~/static/ { ## 这里的root需要和路径结合使用,即是映射的文件位置为 /u ...

  8. nginx: [emerg] “location“ directive is not allowed here

    nginx配置出错. D:\nginx>nginx.exe -t nginx: [emerg] "location" directive is not allowed her ...

  9. nginx: [emerg] “location“ directive is not allowed here in /usr/local/nginx/conf/nginx.conf:72

    做LNMP实验中的PHP设置完测试页面重启nginx时发现重不不成用nginx -t检测说如下原因 nginx: [emerg] "location" directive is n ...

  10. nginx中location介绍

    http://www.cnblogs.com/lidabo/p/4169396.html   博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅  :: 管理 ::   ...

最新文章

  1. Jquery真的不难~第八回 JS的闭包问题
  2. 一个c加一个g是什么牌子_一个G的流量60块钱,为什么会这么贵?
  3. 查看unlix服务器host文件,php代码优化及php相关问题总结
  4. Java黑皮书课后题第8章:*8.26(行排序)用下面的方法实现一个二维数组中的行排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵
  5. html引入latex,如何在html文件中使用MathJax或LaTex?
  6. spring mvc学习(6):springMVC的常见注解
  7. python生成随机数random操作_Python random生成随机数示例
  8. POJ 3278 Catch That Cow
  9. 黑苹果cpu架构???_自研桌面CPU,苹果对英特尔发“分手信”
  10. 【分享】一个电路仿真软件---proteus ISIS
  11. 鼠标键盘录制工具 脚本录制器 游戏脚本录制工具
  12. markdown实现点击链接下载文件
  13. MATLAB--数字图像处理 图像直方图均衡化
  14. 服务器芯片市场容量,未来内存接口芯片市场规模 使用内存接口芯片的服务器内存模组主要有寄存内存模组(RDIMM)和减载内存模组(LRDIMM)两种。RDIMM需要一颗寄... - 雪球...
  15. 弥散磁共振影像处理的黎曼 芬斯勒几何方法研究
  16. 表情识别(七)--面部表情识别阶段综述(2018.4)
  17. C++字符串赋值、拼接、查找、替换、存取、插入删除和子串
  18. SQLyog的安装及使用
  19. itext 5 根据模板生成PDF util类
  20. 用MATLAB实现plu分解,编制计算给定矩阵 A 的 LU 分解和 PLU 分解的通用程序

热门文章

  1. 787. K 站中转内最便宜的航班(动态规划)
  2. 未来哪些职业会被chatGPT取代
  3. 超连接使用confirm的方法
  4. JQ 实现复制到剪切板
  5. 推荐几款比较好用的AI画图软件
  6. C# winform 简单五子棋 200行代码实现双人对战
  7. 【平面设计】设计入门必看-海报设计视频教程-孙伟-专题视频课程
  8. 取石子游戏(hdu1527+威佐夫博弈)
  9. 三星在俄赢得专利诉讼上诉 可自由销售61款手机
  10. 十种智能手机定位跟踪方式解析