文章目录

  • 一、常见的nginx正则表达式
  • 二、location
  • 1.location大致可以分为三类
  • 2.location常用的匹配规则
  • 3.location优先级
  • 4.location示例说明
  • 5.loation匹配顺序
  • 6.三个匹配规则定义
  • 6.1直接匹配网站根
  • 6.2处理静态文件请求
  • 6.3通用规则
  • 三、rewrite
  • 1.语法格式
  • 2.rewrite跳转实现
  • 3.rewrite执行顺序如下
  • 4.flag标记说明
  • 5.rewrite和location区别
  • 四、rewrite案例
  • 1.基于域名的跳转
  • 2.基于客户端IP访问跳转
  • 3.基于旧域名跳转到新域名后面加目录
  • 4.基于参数匹配(多余)的跳转
  • 5.基于目录下所有php结尾的文件跳转
  • 6.基于最普通一条url请求的跳转



一、常见的nginx正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置   如:( jpg | gif | swf )
| :或运算符

二、location

1.location大致可以分为三类

精确匹配:location = /{}
正则匹配:loction ~ / {}
一般匹配:location / {}

2.location常用的匹配规则

=:进行普通字符精确匹配,也就是完全匹配
^~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location
~:区分大小写的匹配
~*:不区分大小写的匹配
!~:区分大小写的匹配取非
!~:不区分大小写的匹配取非

3.location优先级

首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配~和~*
然后匹配不带任何修饰的前缀匹配
最后交给/通用匹配
精确>前缀>正则>一般>通用

匹配某个具体文件location优先级是怎么排列的
(location = 完整路径)>(location ^~完整路径)>(location ~ * 完整路径)>(location ~ 完整路径)>(location 部分起始路径)>(location /)

匹配某个具体目录location优先级是怎么排列的
(location = 目录) > (location ^~ 目录) > (location ~ 目录)> (location ~ * 目录) >(location 目录) > (location /)

4.location示例说明

1.location = / {}
= 为精确匹配 /,主机名后面不能带任何字符串,比如访问/和/data,则/匹配,/data不匹配
再比如location = /abc,则只匹配/abc,/abc/或/abcd不匹配。若location /abc,则既匹配/abc、/abcd/同时也匹配/abc/
2.location / {}
因为所有的地址都是以/开头,所以这条规则将匹配到所有请求,比如访问/和/data,则/匹配,/data也匹配,但若后面是正则表达式,会和最长字符串优先匹配(最长匹配)
3.location /documents/ {}
匹配所有任何以/documents开头的地址,匹配符合以后,还要继续往下搜索其他location,只有其他location后面的正则表达式没有匹配到时,才会采用这一条
4.location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

5.location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

6.location ~ .(gif|jpg|jpeg)$ {}*
匹配所有以 gif、jpg或jpeg 结尾的请求.然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

7.location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

8.location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

9.location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

5.loation匹配顺序

首先看优先级:精确>前缀>正则>一般>通用
优先级相同:正则看上下顺序,上面的有限;一般匹配看长度,最长匹配的优先
精确、前缀、正则、一般都没有匹配到,最后再看通用匹配

6.三个匹配规则定义

实际网站使用中,至少有三个匹配规则定义

6.1直接匹配网站根

1.第一个必选规则直接匹配网站根
2.通过域名访问网站首页比较繁琐,使用这个会加速处理,比如说官网
3.可以是一个静态首页,也可以直接转发给后端应用服务器

location = / {
    root    html;
    index index.html index.htm;
}

6.2处理静态文件请求

1.第二个必须规则是处理静态文件请求,这里nginx作为http服务器的强项
2.有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
目录匹配

location ^~ /static/ {
    root /webroot/static/;
}

后缀匹配

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

6.3通用规则

第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求

location / {
    proxy_pass http://tomcat_server;
}

三、rewrite

rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向
比如:更换域名后需要保持旧的域名能跳转到新的域名商、某网页发生改变需要跳转到新的页面、网站防盗链等等需求
rewrite之恶能放在server{},location{},if{}中,并且默认只能对域名后面的除去传递的参数外的字符串起作用
例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写

1.语法格式

rewrite <regex> <replacement> [flag];
regex: 表示正则匹配规则
replacement: 表示跳转后的内容
flag: 表示rewrite支持的flag标记

2.rewrite跳转实现

Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块set指定:创建新的变量并设其值

3.rewrite执行顺序如下

执行server块里面的rewrite指定
执行location匹配
执行选定的location中的rewrite

4.flag标记说明

last :本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

5.rewrite和location区别

rewrite是同一域名内更改获取资源的路径(本地不同文件的跳转)
location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器(不同节点的跳转)


四、rewrite案例

1.基于域名的跳转

现在公司旧域名www.ngs.com 有业务需求变更,需要使用新域名 www.sen.com 代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

添加地址映射关系:www.ngs.com为旧域名,www.sen.com为新域名

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_bc


编辑nginx配置文件

vim /usr/local/nginx/conf/nginx.conf

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_bc_02


访问旧域名www.ngs.com会跳转至新域名www.sen.com

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_unix_03

2.基于客户端IP访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.226.131访问正常
编辑配置文件

vim /usr/local/nginx/conf/nginx.conf

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_nginx 正则 对字符串提取_04

在/var/www/html下创建一个维护页面文件,因为我们配置文件中除本地IP访问的其他IP都指向这个路径下页面文件(也就是weihu.html)

cd /var/www/html/
vim weihu.html

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_正则表达式_05


重新加载nginx

systemctl reload nginx    #重新加载nginx

测试

我们使用192.168.226.131本机浏览器进行访问

本机访问我们需要在/etc/hosts中添加映射

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_unix_06


可以访问到

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_nginx 正则 对字符串提取_07


在使用其他机器浏览器进行访问显示维护页面

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_正则表达式_08

3.基于旧域名跳转到新域名后面加目录

当前访问得是http://bbs.ngs.com/post/1.html会自动跳转到http://www.ngs.com/bbs/post/1.html
创建网页文件

mkdir -p /usr/local/nginx/html/bbs/post
cd /usr/local/nginx/html/bbs/post
vim 1.html

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_bc_09


修改配置文件

vim /usr/local/nginx/conf/nginx.conf

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_正则表达式_10


重新加载nginx服务

systemctl reload nginx         #重新加载nginx

测试

访问bbs.ngs.com/post/1.html会跳转到www.ngs.com/bbs/post/1.html

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_bc_11

4.基于参数匹配(多余)的跳转

修改配置文件

vim /usr/local/nginx/conf/nginx.conf

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_正则表达式_12

测试

访问www.ngs.com/100-100-100/.html

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_unix_13

5.基于目录下所有php结尾的文件跳转

要求访问http://www.ngs.com/up;oad/123.php跳转到首页www.ngs.com(场景:注册、登录)
修改配置文件

vim /usr/local/nginx/conf/nginx.conf

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_nginx_14

测试

访问www.ngs.com/upload/123.html跳转到www.ngs.com

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_unix_15

6.基于最普通一条url请求的跳转

要求访问一个具体的页面,如:http://www.ngs.com/abc/123.heml,跳转到首页
修改配置文件

vim /usr/local/nginx/conf/nginx.conf

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_nginx_16


测试

访问www.ngs.com/abc/123.html会跳转至www.ngs.com首页

nginx 正则 对字符串提取 nginx 正则表达式匹配入门篇_bc_17