文章目录
前言
在日常运维中 经常遇到旧网站和平台需要停机维护和业务升级 在完成之前网页和平台是无法访问 就需要进行跳转到其他网页或者404界面
一、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] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符
二、location
1 location分类
精准匹配:location = / {…}
一般匹配:location / {…}
正则匹配:location ~ / {…}
2 匹配的选项
= 进行普通字符精确匹配,也就是完全匹配。
^~ 表示普通字符匹配,使用前缀匹配 匹配到就停止
~ 区分大小写的匹配
~* 不区分大小写的匹配
!~ 区分大小写的匹配取反
!~* 不区分大小写的匹配取反
3 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 /)
4 匹配规则
在网站使用中,至少有三种规则定义
第一个为必选规则
直接匹配网站的根域,通过域名访问网站首页比较繁琐,使用这个会加速处理,比如说官网。可以是一个静态首页,也可以直接转发给后端应用服务器。
location = / {
proxy_pass http://tomcat_server/;
}
第二个必选归则是处理静态文件请求,这是nginx作为http服务器的强项有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
第三个为通用规则 比如用来转发带 .php .jsp后缀的动态请求到后端应用服务器非静态文件请求就默认动态请求
location / {
proxy_pass http://tomcat_server;
}
三 rewrite
rewrite的主要功能是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL的重写以及重定向。
在一些场景 比如更换域名后需要保持旧的域名可以跳转到新的域名上 某网页发生改变需要跳转到新的界面 网站防盗链等
rewirte只可以放在server{} location{} if{}中,并且默认只可以对域名后面除去传递的参数外的字符串起作用。
例子 http://www.lic.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。
跳转实现
nginx 通过ngx_http_rewrite_module 模块支持URL重写 支持if条件判断,但不支持else分支。
跳转 从一个location跳转到另一个location 循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块set 指令 创建新的变量并设其值。
执行顺序
先执行server项里面的rewrte指令
再执行location匹配
最后执行选定的location中的rewrite
语法格式 rewrite;
regex:表示正则匹配规则
replacement:表示跳转后的内容
flag:表示rewrite支持的flag标记
flag说明
last 本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中。
break 本条规则匹配完成即终止,不在匹配后面的任何规则,一般使用再location中。
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。
rewire匹配实例
分为六种
域名跳转
第一种为基于域名的跳转 从旧域名跳转到新域名 但是旧的域名不可以弃用 ,需要跳转到新域名上 且参数不变。
创建网站日志文件
映射主机dns
去浏览器检测是否会跳转
已经跳转。
基于IP地址跳转
适用于进行维护 给网址跳转出维护界面 只有公司内网可以访问 其他的地址访问都是维护界面
添加维护的字样 到文件 先创建日志目录,重启服务
去浏览器访问
其他ip无法访问
基于旧域名跳转到新域名后面追加目录
基于参数匹配的跳转
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.ash.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.ash.com-access.log main;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.+) http://www.ash.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
基于目录下所有 php 结尾的文件跳转
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lic.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.lic.com-access.log main;
location ~* /upload/.*.php$ {
rewrite (.+) http://www.lic.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}