Nginx正则配置

NoBug
• 阅读 9493

Nginx配置中Location的语法规则 location [ = | ~ | ~* | ^~ | !~ | !~* ] /uri/{ … }

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

<!-- more -->

匹配顺序

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

  1. 首先匹配 =
  2. 其次匹配 ^~
  3. 其次是按文件中顺序的正则匹配
  4. 最后是交给 / 通用匹配

当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

常用的规则

  1. 精确匹配
location = / {
  proxy_pass http://127.0.0.1:9090/
}

将所有请求直接转发给服务器的9090端口。

  1. 处理静态文件
#目录匹配
location ^~ /static/ {
  root /webroot/static/;
}
#后缀匹配
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
  root /webroot/res/;
}
  1. 转发动态请求到后端应用服务器
#将/account/开始的请求转发给Account服务器
location /account/ {
    proxy_pass http://127.0.0.1:8080/
}
#将/order/开始的请求转发给Order服务器
location /order/ {
    proxy_pass http://127.0.0.1:9090/
}

rewrite指令

  • last 相当于apache里面的[L]标记,表示rewrite。
  • break 本条规则匹配完成后,终止匹配,不再匹配后面的规则。
  • redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
  • permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。
  1. 使用lastbreak实现URI重写,浏览器地址栏不变。
  2. 使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。
  3. last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。

举个例子

例子只是为了大家理解,不是实际场景。

服务器提供一个接口 /api/v1/access, 终端用户可以通过浏览器页面访问, 也可以通过公众号访问,也可以通过App访问。

需求来了,想要根据不同的渠道统计访问数,我们在终端调用接口的时候各自分配一个数字。

  • 浏览器页面:10000
  • 公众号内页面:20000
  • App页面操作:30000

不同终端在访问接口时将数字拼在接口前面,如:/10000/api/v1/access

Nginx需要把所有访问请求转到服务器,配置如下:

location ~/([0-9]+)/(.*)$ {
  rewrite /([0-9]+)/(.*)$ /$2 break;
  proxy_pass http://127.0.0.1:9090;
}

$2 表示路径中正则表达式匹配的第二个参数,也就是 (.*) 这部分。

好了,可能有朋友就问,这样就可以统计不同渠道的访问量了? 答案肯定是不行的么,nginx这块只是做了将不同渠道的请求转发到同一个服务去,它并没有做统计的工作。

统计的工作不属于本片文章的内容,但是放心。 既然提到了这块内容,实现方案还是要给大家讲的么。

原理很简单,Nginx的access访问日志中记录了所有请求记录,我们就可以拿这个数据去做统计,我这里仅说一种ELK方案:就是将日志数据推送到Elasticsearch中,然后就可以在Kibana中做图标展示这些指标了。想要了解ELK,请看我的另一篇文章使用 ELK(Elasticsearch + Logstash + Kibana) 搭建日志收集分析平台

欢迎访问我的个人博客

关注公众号:JAVA九点半课堂,回复【资料】获取 2T 最新技术资料,每天还有技术分享,我们一起进步,谢谢!

点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础11——正则表达式
19正则表达式19.1正则基础正则表达式:字符串处理工具应用场景1.html查询2.验证字符串是否符合规则re模块match方法python通过正则表达式对字符串进行匹配importre使用match方法进行匹配操作re.match()从字符串的开始位置进行匹配,匹配成功,返回match对象。匹配失败,返回Noneresre
Wesley13 Wesley13
3年前
java正则表达式
Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点)1     英文句点符号:匹配单个任意字符。eg:表达式”t。o 可以匹配:tno,to,teo等等。不可以匹配:tnno,to,Tno,t正o等。2     方括号:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。eg:表达式:t\ab
Stella981 Stella981
3年前
Nginx 伪静态Rewrite,重定向Location配置总结(转)
语法规则:location\|~|~\|^~\/uri/{…}\开头表示精确匹配^~开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~/static//aa匹配到(注意是空格)。~开头表示区分大小写的正则匹配~\ 
Wesley13 Wesley13
3年前
MYSQL正则表达式
MySQL中使用REGEXP操作符来进行正则表达式匹配。下表中的正则模式可应用于REGEXP操作符中。模式描述^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配'\\n'或'\\r'之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Mul
Stella981 Stella981
3年前
Python 正则表达式规则
正则表达式的一些匹配规则:.:用于匹配任意一个字符,如a.c可以匹配abc、aac、akc等^:用于匹配以...开头的字符,如^abc可以匹配abcde、abcc、abcak等$:用于匹配以...结尾的字符,如abc$可以匹配xxxabc、123abc等\:匹配前一个字符零次或多次,如abc
Stella981 Stella981
3年前
Nginx配置中Location的优先级
根据Nginx的官方文档,Location标签一共有四个修饰符,分别是:(1):表示完全匹配;(2)^~:匹配URI的前缀,并且后面的正则表达式不再匹配,如果一个URI同时满足两个规则的话,匹配最长的规则;(3)~:匹配正则表达式,大小写敏感;(4)~:匹配正则表达式,大小写不敏感;优先级:(1
Stella981 Stella981
3年前
Nginx 的 location 匹配规则
约定本文以Nginx1.17.6主线版为准。引言location是Nginx配置中的重要一环,用来配置动静分离、反向代理等功能。而location匹配规则,网上有太多错误的说法,今予以纠正并给出正确规则描述。最常见的错误最常见的错误之一,就是认为^~的优先级高于~,但实际上,我们
Stella981 Stella981
3年前
Python正则表达式精讲
_摘要:_ Python正则表达式精讲一、什么是正则表达式正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。Python正则表达式精讲一、什么是正则表达式正则表达式,又称正规表示式、正规表示法、正规表
Stella981 Stella981
3年前
Regex 正则表达式入门
!在这里插入图片描述(https://imgblog.csdnimg.cn/20200502170142100.jpg?pic_center)0,什么是正则表达式正则表达式(RegularExpression简写为Regex),又称为规则表达式,它是一种强大的文本匹配模式,其用于在字符串中查找匹配符
Stella981 Stella981
3年前
Linux文本处理常用命令
1.正则表达式(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符az)以及特殊字符(称为元字符,如/、\、?等)组成。(2)基本元字符集及其含义^:只匹配行首。 如^a匹配以a开头的行abc,a2e,a12,aaa,......$:只匹配行尾。 如^a匹配以a结尾的行bca,12a,
Stella981 Stella981
3年前
JavaScript基础入门10
JavaScript基础入门10\toc\正则表达式正则表达式(regularexpression)是一个描述字符模式的对象。在JavaScript中,RegExp表示正则对象。在开发的工作当中,我们经常需要使用正则表达式强大的模式匹配、文本检索、以及替换功能。简单的说,