一、常用的Nginx 正则表达式

字符 寓意以及示例
匹配输入字符串的开始方位
$ 匹配输入字符串的完毕方位
* 匹配前面的字符零次或屡次;如“ol*”能匹配“o”及“ol”、“oll”
+ 匹配前面的字符一次或屡次;如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? 匹配前面的字符零次或一次;例如“do(es)?”能匹配“do”或许“does”,”?”等效于”{0,1}”
. 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的恣意字符,请运用诸如“[.\n]”之类的形式
\ 将后边接着的字符符号为一个特别字符或一个原义字符或一个向后引证。如“\n”匹配一个换行符,而“”则匹配“”则匹配“
\d 匹配纯数字
\s 匹配空的(空格或许制表符)
{n} 重复 n 次
{n,} 重复 n 次或更屡次
{n,m} 重复 n 到 m 次
[ ] 定义匹配的字符规模
[c] 匹配单个字符 c
[a-z] 匹配 a-z 小写字母的恣意一个
[a-zA-Z0-9] 匹配一切大小写字母或数字
() 表达式的开始和完毕方位
或运算符

二、拜访路由location

1、location的分类

location 大致能够分为三类:

  • 精准匹配:location = / {}
  • 一般匹配:location / {}
  • 正则匹配:location ~ / {}

2、location 常用的匹配规矩:

字符 寓意
= 进行一般字符准确匹配,也便是彻底匹配
^~ 表明一般字符匹配。运用前缀匹配。假如匹配成功,则不再匹配其它 location
~ 区别大小写的匹配
~* 不区别大小写的匹配
!~ 区别大小写的匹配取非
!~* 不区别大小写的匹配取非

3、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 文件,假如和正则 ~ /images/abc/1.html 比较,正则优先级更高

优先级总结:

(location =) > (location 完整途径) > (location ^~ 途径) > (location ,* 正则次序) > (location 部分开始途径) > (location /)

location匹配

首先看优先级:准确>前缀>正则>一般>通用

优先级相同:正则看上下次序,上面的优先;一般则看长度,最长匹配优先

准确、前缀、正则、一般都没有匹配到就看通用

5、实践网站运用中的三个匹配规矩定义:

5.1 第一个必选规矩

直接匹配网站根,通过域名拜访网站主页比较频繁,运用这个会加速处理,比方说官网。
这里是直接转发给后端应用服务器了,也能够是一个静态主页

location = / {
    proxy_pass http://tomcat_server/;
}

5.2 第二个必选规矩是处理静态文件恳求

这是nginx作为http服务器的强项!
有两种装备形式,目录匹配或后缀匹配,任选其一或搭配运用

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

5.3 第三个规矩便是通用规矩

比方用来转发带.php、.jsp后缀的动态恳求到后端应用服务器
非静态文件恳求就默认是动态恳求

location / {
    proxy_pass http://tomcat_server;
} 

三、拜访从头rewrite

1、rewrite的概述

rewrite功能便是,运用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除掉传递的参数外的字符串起作用,

例如:

www.xkq.com/kgc/index.p… 只对/kgc/index.php重写。

2、rewrite 履行次序如下:

(1) 履行 server 块里面的 rewrite 指令

(2) 履行 location 匹配

(3) 履行选定的 location 中的 rewrite 指令

语法: rewrite [flag];

regex :表明正则匹配规矩

replacement :表明跳转后的内容

flag :表明 rewrite 支撑的 flag 符号

###flag符号阐明###

last :本条规矩匹配完成后,持续向下匹配新的location URI规矩,一般用在 server 和 if 中

break :本条规矩匹配完成即终止,不再匹配后边的任何规矩,一般运用在 location 中

redirect:回来302暂时重定向,浏览器地址会显现跳转后的URL地址

permanent:回来301永久重定向,浏览器地址栏会显现跳转后的URL地址。

四、rewrite 示例:

1、根据域名跳转

1.1 根据域名跳转——操作过程

现在公司旧域名www.xkq.com有业务需求改变,需要运用新域名www.wy.com替代,但是旧域名不能废除,需要跳转到新域名上,并且后边的参数坚持不变。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xkq.com;                                        #域名修正  
    charset utf-8;
    access_log  /var/log/nginx/www.ly.com-access.log;     #日志修正
    location / {                                                    #增加域名重定向
        if ($host = 'www.xkq.com'){                                  #$host为rewrite全局变量,代表恳求主机头字段或主机名
            rewrite ^/(.*)$ http://www.wy.com/$1 permanent;        #$1为正则匹配的内容,即域名后边的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}
echo "192.168.2.66 www.xkq.com www.wy.com" >> /etc/hosts
systemctl restart nginx                 #重启服务

浏览器输入模拟拜访 www.xkq.com/test/index.…

1.2 实例操作:根据域名跳转

1.2.1 修正主装备文件

1.2.2 重启服务并增加映射联系

1.2.3 创立网页

1.2.4 浏览器中拜访测验

2、根据客户端 IP 拜访跳转

2.1 根据客户端 IP 拜访跳转的操作过程

要求:今天公司业务新版本上线,要求一切 IP 拜访任何内容都显现一个固定保护页面,只要公司 IP :192.168.2.66拜访正常

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xkq.com;        #域名修正  
    charset utf-8;
    access_log  /var/log/nginx/www.xkq.com-access.log;       #日志修正
    #设置是否合法的IP符号
    set $rewrite true;                          #设置变量$rewrite,变量值为boole值true
    #判别是否为合法IP
    if ($remote_addr = "192.168.2.66"){       #当客户端IP为192.168.2.66时,将变量值设为false,不进行重写
        set $rewrite false;
    }
    #除了合法IP,其它都是不合法IP,进行重写跳转保护页面
    if ($rewrite = true){                       #当变量值为true时,进行重写
        rewrite (.+) /index.html;               #重写在拜访IP后边插入/index.html,例如192.168.2.66/index.html
    }
    location = /index.html {
        root /var/www/html;                     #网页回来/var/www/html/index.html的内容
    }
    location / {
        root   html;
        index  index.html index.htm;
    }
}
mkdir -p /var/www/html/
echo "<h1>正在保护</h1>" > /var/www/html/index.html
systemctl restart nginx

2.2 实例操作:根据客户端 IP 拜访跳转

2.2.1 修正装备文件

2.2.2 检查装备文件并重启服务

2.2.3 创立跳转后的网页目录和内容

2.2.4 浏览器拜访测验

本机拜访

其他主机拜访

拜访之前做域名IP映射

3、根据旧域名跳转到新域名后边加目录

3.1 根据旧域名跳转到新域名后边加目录的操作过程

现在拜访的是 bbs.xkq.com/test,现在需要将这…

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  bbs.xkq.com;        #域名修正  
    charset utf-8;
    access_log  /var/log/nginx/bbs.xkq.com-access.log;
    #增加
    location /test {
        rewrite (.+) http://www.xkq.com/bbs$1 permanent;     #这里的$1为方位变量,代表/test
    }
    location / {
        root   html;
        index  index.html index.htm;
    }
}
mkdir -p /usr/local/nginx/html/bbs/post
echo "this is web"  >> /usr/local/nginx/html/bbs/test/1.html
echo "192.168.2.66 bbs.xkq.com www.xkq.com"  >> /etc/hosts
systemctl restart nginx

运用浏览器拜访 bbs.xkq.com/ test/1.html 跳转到 www.xkq.com/bbs/test/1.…  

3.2 实例操作:根据旧域名跳转到新域名后边加目录

3.2.1 修正主装备文件

3.2.2 重启服务并创立网页文件

3.2.3 增加映射联系并运用浏览器拜访测验

跳转前

跳转后

4、根据参数匹配的跳转

4.1 根据参数匹配的跳转的过程

拜访www.xkq.com/100-(100|20… 跳转到www.xkq.com页面

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xkq.com;        #域名修正  
    charset utf-8;
    access_log  /var/log/nginx/xkq.kgc.com-access.log;
    if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.*) http://www.xkq.com permanent;
    }
    location / {
        root   html;
        index  index.html index.htm;
    }
systemctl restart nginx

解释:

request_uri: 包括恳求参数的原始URI,不包括主机名,如: [http://www.kgc.com/abc/bbs/index.html?a=1&b=2中的/abc/bbs/index.php?a=1&b=2](http://www.kgc.com/abc/bbs/index.html?a=1&b=2%E4%B8%AD%E7%9A%84/abc/bbs/index.php?a=1&b=2) uri:这个变量指当时的恳求URI,不包括任何参数,如: /abc/bbs/index.html
documenturi:与document_uri: 与uri相同, 这个变量指当时的恳求URI,不包括任何传递参数,如:/abc/bbs/index.html

用浏览器拜访 www.xkq.com/100-200-100… 或 www.xkq.com/100-100-100… 跳转到www.xkq.com页面 

4.2 实例操作:根据参数匹配的跳转

4.2.1 修正装备文件

4.2.2 浏览器拜访测验

跳转前

跳转后

5、根据目录下一切 php 结束的文件跳转

要求拜访 www.xkq.com/upload/123.… 跳转到主页。

5.1 根据目录下一切 php 结束的文件跳转的操作过程

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xkq.com;        #域名修正  
    charset utf-8;
    access_log  /var/log/nginx/www.xkq.com-access.log  main;
    location ~* /upload/.*.php$ {
        rewrite (.+) http://www.xkq.com permanent;
    }
    location / {
        root   html;
        index  index.html index.htm;
    }
}
systemctl restart nginx

浏览器拜访 www.xkq.com/upload/888.… 跳转到www.xkq.com页面。

5.2 实例操作:根据目录下一切 php 结束的文件跳转

5.2.1 修正装备文件

5.2.2 浏览器拜访测验

跳转前


跳转后

6、根据最一般一条 url 恳求的跳转

6.1 根据最一般一条 url 恳求的跳转的操作过程

要求拜访一个具体的页面如 www.xkq.com/abc/888.htm… 跳转到主页

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xkq.com;        #域名修正  
    charset utf-8;
    access_log  /var/log/nginx/www.xkq.com-access.log;
    location ~* ^/abc/888.html {
        rewrite (.+) http://www.xkq.com permanent;
    }
    location / {
        root   html;
        index  index.html index.htm;
    }
}
systemctl restart nginx

浏览器拜访 www.xkq.com/abc/888.htm… 跳转到www.xkq.com页面。  

6.2 实例操作:根据最一般一条 url 恳求的跳转

6.2.1 修正装备文件

6.2.2 浏览器拜访测验

跳转前

跳转后