Nginx之正则表达式、location匹配简介以及rewrite重写
⽬录
⽬录
⼀、Nginx 正则表达式
1^ :匹配输⼊字符串的起始位置
2$ :匹配输⼊字符串的结束位置
3* :匹配前⾯的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
4+ :匹配前⾯的字符⼀次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
5? :匹配前⾯的字符零次或⼀次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
6. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使⽤诸如“[.\n]”之类的模式
7\ :将后⾯接着的字符标记为⼀个特殊字符或⼀个原义字符或⼀个向后引⽤。如“\n”匹配⼀个换⾏符,⽽“\$”则匹配“$”
8\d :匹配纯数字
9\w :匹配字母或数字或下划线或汉字
10\s :匹配任意的空⽩符
11\b :匹配单词的开始或结束
12{n} :重复 n 次
13{n,} :重复 n 次或更多次concatenate函数所表示的意思是什么
14{n,m} :重复 n 到 m 次
15[] :定义匹配的字符范围
16[c] :匹配单个字符 c
17[a-z] :匹配 a-z ⼩写字母的任意⼀个
18[a-zA-Z0-9] :匹配所有⼤⼩写字母或数字
19() :表达式的开始和结束位置
20| :或运算符
21
⼆、location 匹配简介
从功能看,rewrite 和 location 似乎很像,都能实现跳转,主要区别在于 rewrite 是在同⼀域名内更改获取资源的路径,⽽ location 是对⼀类路径做控制访问或反向代理,还可以 proxy_pass 到其他机器。
1、匹配规则格式
①、精准匹配
location = / {...}
②、⼀般匹配
location / {...}
③、正则匹配
location ~ / {...}
2、常⽤的匹配规则
1= :进⾏普通字符精确匹配,也就是完全匹配。
2^~ :表⽰普通字符匹配。使⽤前缀匹配。如果匹配成功,则不再匹配其它 location。
3~ :区分⼤⼩写的匹配。
4~* :不区分⼤⼩写的匹配。
5!~ :区分⼤⼩写的匹配取⾮。
6!~* :不区分⼤⼩写的匹配取⾮。
javascript数组元素访问方式
2          #规则A
3      }
4      location = /lucien {
5          #规则B
6      }
7      location ^~ /lucien/ {
8          #规则C
9      }
10      location ~ \.(gif|jpg|png)$ {
11          #规则D
12      }
13      location ~* \.png$ {
14          #规则E
15      }30岁护肤品推荐
16      location !~ \.html$ {
17          #规则F
18      }
19      location !~* \.html$ {
20          #规则G
21      }
22      location / {
23          #规则H
24      }
3、匹配的优先级
⾸先精确匹配 =
其次前缀匹配 ^~
再其次是按⽂件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配(⼀般匹配)最后是交给 / 通⽤匹配
4、⽰例
2=为精确匹配 / ,主机名后⾯不能带任何字符串,⽐如访问 / 和 /data,则 / 匹配,/data 不匹配
3再⽐如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
4
5(2)location / {}
6因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求⽐如访问 / 和 /data, 则 / 匹配, /data 也匹配,
7但若后⾯是正则表达式会和最长字符串优先匹配(最长匹配)
8
9(3)location /documents/ {}
10匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
11只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这⼀条
12
13(4)location /documents/abc {}
14匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
15只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这⼀条
16
17(5)location ^~ /images/ {}
18匹配任何以 /images/ 开头的地址,匹配符合以后,停⽌往下搜索正则,采⽤这⼀条
19
20(6)location ~* \.(gif|jpg|jpeg)$ {}
21匹配所有以 gif、jpg或jpeg 结尾的请求
22然⽽,所有请求 /images/ 下的图⽚会被 location ^~ /images/ 处理,因为 ^~ 的优先级更⾼,所以到达不了这⼀条正则
23
24(7)location /images/abc {}
25最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
26
27(8)location ~ /images/abc {}
28匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采⽤这⼀条
29
30(9)location /images/abc/1.html {}
31匹配/images/abc/1.html ⽂件,如果和正则 ~ /images/abc/1.html 相⽐,正则优先级更⾼
5、实际⽹站使⽤中,⾄少有三个匹配规则定义
①、第⼀个必选规则
1直接匹配⽹站根,通过域名访问⽹站⾸页⽐较频繁,使⽤这个会加速处理,⽐如说官⽹。
2这⾥是直接转发给后端应⽤服务器了,也可以是⼀个静态⾸页
java项目开发实战3
4location = / {
5    proxy_pass tomcat_server/;
6}
②、第⼆个必选规则
1处理静态⽂件请求,这是nginx作为http服务器的强项
2有两种配置模式,⽬录匹配或后缀匹配,任选其⼀或搭配使⽤
3
4location ^~ /static/ {
5    root /webroot/static/;
6}
7
8location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
9    root /webroot/res/;
10}
③、第三个规则
1通⽤规则,⽐如⽤来转发带.php、.jsp后缀的动态请求到后端应⽤服务器
2⾮静态⽂件请求就默认是动态请求
3
4location / {
5    proxy_pass tomcat_server;
6}
三、rewrite重写
rewrite功能就是使⽤nginx提供的全局变量或⾃⼰设置的变量,结合正则表达式和标记实现URL重写以及重定向。
例如:更换域名后需要保持旧的域名能够转到新的域名上、某⽹页发⽣改变需要跳转到新的页⾯、⽹站防盗链等等需求。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后⾯的除去传递的参数外的字符串
起作⽤。
例如:www.lucien/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。
1、rewrite 跳转实现
Nginx:通过ngx_http_rewrite_module模块⽀持URL重写、⽀持if条件判断,但不⽀持else
跳转:从⼀个location跳转到另⼀个location,循环最多可以执⾏10次,超过后nginx将返回500错误
PCRE⽀持:perl兼容正则表达式的语法规则匹配
重写模块set指令:创建新的变量并为其赋值
2、rewrite执⾏顺序
执⾏server块⾥⾯的rewrite指令
执⾏location匹配
执⾏选定的location中的rewrite指令
3、rewrite语法格式
rewrite <regex> <replacement> [flag]
regex:表⽰正则匹配规则
replacement:表⽰跳转后的内容
flag:表⽰rewrite⽀持的flag标记
①、flag标记说明
1last – 基本上都⽤这个Flag。
2break – 中⽌Rewirte,不在继续匹配
3redirect – 返回临时重定向的HTTP状态302
4permanent – 返回永久重定向的HTTP状态301
5
6注:last和break最⼤的不同在于
7- break 是终⽌当前location的rewrite检测,⽽且不再进⾏location匹配
8- last是终⽌当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则
②、可⽤来判断的表达式
1-f 和 !-f⽤来判断是否存在⽂件
2-d 和 !-d⽤来判断是否存在⽬录
3-e 和 !-e⽤来判断是否存在⽂件或⽬录
4-x 和 !-x⽤来判断⽂件是否可执⾏
③、可⽤作判断的全局变量
1$args          #这个变量等于请求⾏中的参数。
2$content_length # 请求头中的Content-length字段。
3$content_type  # 请求头中的Content-Type字段。
4$document_root  # 当前请求在root指令中指定的值。
5$host          # 请求主机头字段,否则为服务器名称。
6$http_user_agent # 客户端agent信息
7$http_cookie    # 客户端cookie信息
8$limit_rate    # 这个变量可以限制连接速率。
9$request_body_file # 客户端请求主体信息的临时⽂件名。
10$request_method  # 客户端请求的动作,通常为GET或POST。
11$remote_addr    # 客户端的IP地址。
12$remote_port    # 客户端的端⼝。
13$remote_user    # 已经经过Auth Basic Module验证的⽤户名。
14$request_filename # 当前请求的⽂件路径,由root或alias指令与URI请求⽣成。
15$query_string  # 与$args相同。
16$scheme #HTTP ⽅法(如http,https)。
17$server_protocol # 请求使⽤的协议,通常是HTTP/1.0或HTTP/1.1。
18$server_addr    # 服务器地址,在完成⼀次系统调⽤后可以确定这个值。
19$server_name    # 服务器名称。
20$server_port    # 请求到达服务器的端⼝号。
21$request_uri    # 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
22$uri # 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
23$document_uri  # 与$uri相同。
position和location的区别
24例:localhost:88/test1/test2/test.php
25$host:localhost
26$server_port:88
27$request_uri:localhost:88/test1/test2/test.php
28$document_uri:/test1/test2/test.php
29$document_root:D:\nginx/html
30$request_filename:D:\nginx/html/test1/test2/test.php
四、rewrite 跳转
1、基于域名的跳转向量运算公式大全
公司旧域名www.ljm有业务需求变更,需要使⽤新域名www.lucien代替,但是旧域名不能废除,需要跳转到新域名上,⽽且后⾯的参数保持不变。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。