• 售前

  • 售后

热门帖子
入门百科

Nginx location匹配规则的方法示例

[复制链接]
明功 显示全部楼层 发表于 2021-10-25 18:57:33 |阅读模式 打印 上一主题 下一主题
1、语法
  1. location [=|~|~*|^~|@] /uri/ {
  2. ...
  3. }
复制代码
2、说明

从上面的语法出发,可以相识到 location 可以区分为三个部分,接下来一个一个的研究一下。
1) [=|~|~*|^~|@]
      
  • = : 表现正确匹配背面的url  
  • ~ : 表现正则匹配,但是区分大小写  
  • ~* : 正则匹配,不区分大小写  
  • ^~ : 表现普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目次  
  • @ : "@" 界说一个定名的 location,利用在内部定向时,比方 error_page
上面界说了几个差别的符号,表现差别的匹配规则,那么先后顺序呢?
      
  • = 前缀的指令严酷匹配这个查询。如果找到,制止搜刮;  
  • 所有剩下的常规字符串,最长的匹配。如果这个匹配利用 ^~ 前缀,搜刮制止;  
  • 正则表达式,在设置文件中界说的顺序;  
  • 如果第 3 条规则产生匹配的话,结果被利用。否则,利用第 2 条规则的结果。
测试示例1:
  1. location = /world {
  2. return 600;
  3. }
  4. location = /hello {
  5. return 600;
  6. }
  7. location ~ /hellowo {
  8. return 602;
  9. }
  10. location ^~ /hello {
  11. return 601;
  12. }
复制代码
  1. - 请求 localhost/world 返回600
  2. - 请求 localhost/world2 localhost/test/world 返回其他
  3. - 请求 localhost/hello 返回600
  4. - 请求 localhost/hello/123 返回601
  5. - 请求 localhost/hellow 返回601
  6. - 请求 localhost/hellowo 返回601
  7. - 请求 localhost/test/hellowo 返回602
  8. - 请求 localhost/test/hello 返回其他
复制代码
因此可以知道:
      
  • = 是正确完备匹配,且优先级最高;  
  • 正则匹配时,如果 ~ 和 ^~ 同时匹配规则,则 ^~ 优先;  
  • ^~ 这个规则不会匹配请求 url 中背面的路径,如上面的 /test/hello 没有匹配上  
  • ^~ 不支持正则,和 = 相比,范围更广,hellowo 是可以被 ^~ 匹配,但是 = 不会匹配;  
  • ~ 路径中只要包含就可以匹配,如上面的 /test/hellowo 返回了 602
测试示例2:
  1. location ~ /hello {
  2. return 602;
  3. }
  4. location ~ /helloworld {
  5. return 601;
  6. }
复制代码
  1. - 请求 localhost/world/helloworld 返回 602
  2. - 请求 localhost/helloworld 返回 602
复制代码
调整上面的顺序
  1. location ~ /helloworld {
  2. return 601;
  3. }
  4. location ~ /hello {
  5. return 602;
  6. }
复制代码
  1. - 请求 localhost/helloworld 返回601
  2. - 请求 localhost/world/helloworld 返回601
  3. - 请求 localhost/helloWorld 返回602
复制代码
以是同时正则匹配时
      
  • 放在前面的优先匹配  
  • 留意如果不区分大小写时,利用 ~*  
  • 只管将正确匹配的放在前面
测试示例3:
  1. location ^~ /hello/ {
  2. return 601;
  3. }
  4. location /hello/world {
  5. return 602;
  6. }
复制代码
这种场景中,存在一个没有符合的路由规则,那么现实的测试是怎样呢?
  1. - http://localhost/hello/wor 返回601
  2. - http://localhost/hello/world 返回602
  3. - http://localhost/hello/world23 返回602
  4. - http://localhost/hello/world/123 返回602
复制代码
从上面的示例可以看出
      
  • 没有符合时,全匹配是优先 ^~ 的
2) [uri]

这里告急填的是须要匹配的 path 路径,根据前面的符号,这里可以填写正确到 path 路径,也可以填正则表达式,下面则告急针对正则举行说明
      
  • . : 匹配除换行符以外的恣意字符  
  • ? : 重复0次或1次  
  • + : 重复1次或更多次  
  • * : 重复0次或更多次  
  • \d :匹配数字  
  • ^ : 匹配字符串的开始  
  • $ : 匹配字符串的介绍  
  • {n} : 重复n次  
  • {n,} : 重复n次或更多次  
  • [c] : 匹配单个字符c  
  • [a-z] : 匹配a-z小写字母的恣意一个  
  • 小括号()之间匹配的内容,可以在背面通过$1来引用,$2表现的是前面第二个()里的内容。正则内里目面貌易让人困惑的是\转义特殊字符。
路由转发

请求 path 匹配只是第一步,匹配完成之后,怎样将请求转发给其它的 web 服务呢?

1、反向署理

通常可见的一种利用姿势就是利用 nginx 署理请求,转发到内部的其它 web 服务上
告急通过 prixy_pass 来实现
  1. location ^~ /webs {
  2. proxy_pass http://127.0.0.1:8080/webs;
  3. }
复制代码
上面规则的寄义是,将所有以 webs 开头的请求,转发到 8080 端口的 web 服务上。
上面是直接写死转发到一个 ip 上,如果是多个呆板提供服务,可以如许设置
  1. ## 下面放在http的括号内,作为第一层
  2. upstream test.online {
  3. server 120.11.11.11:8080 weight=1;
  4. server 120.11.11.12:8080 weight=1;
  5. }
  6. location ^~ /webs {
  7. proxy_pass http://test.online;
  8. proxy_redirect default;
  9. }
复制代码
2、Rewrite 命令

rewrite功能就是,利用nginx提供的全局变量或本身设置的变量,联合正则表达式和标志位实现url重写以及重定向。
rewrite只能放在server{},location{},if{}中,并且只能对域名后边的撤除转达的参数外的字符串起作用, 如
http://jb51.net/a/we/index.php?id=1&u=str

只对/a/we/index.php重写。
语法: rewrite regex replacement [flag];

示例:
  1. location ^~ /hexo {
  2. root '/Users/yihui/GitHub/';
  3. }
  4. location ~ /hello {
  5. rewrite ^(/hello).*$ /hexo/public/index.html last;
  6. return 603;
  7. }
复制代码
将hello开头的,全部转发到/hexo/public/index.html

以上就是本文的全部内容,渴望对大家的学习有所帮助,也渴望大家多多支持草根技能分享。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作