nginx与rewrite跳转
前言
现在Nginx已经成为很多公司作为前端反向代理(proxy pass)服务器的首选,在实际工作中往往会遇到很多跳转(重写URL)的需求。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的 Apache服务器,虽然也能做跳转,规则库也很强大,但是用Nginx跳转效率会更高
一.rewite跳转场景
(1)调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
(2)为了让搜索引擎搜寻网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
(3)网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到jd.com。
(4)服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行URL调整等。旧的URL 匹配和重新跳转新的URL
二.rewrite跳转实现
Nginx:通过nginx_http rewrite_module模块支持URL重写、支持if条件判断,但不支持else跳转:
从一个iocation跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持: perl兼容正则表达式的语法规则匹配
重写模块set 指令:创建新的变量并设其值
三.rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
四.rewrite实际场景
1.Nginx跳转需求的实现方式
(1)使用rewrite进行匹配跳转
(2)使用if匹配全局变量后跳转
(3)使用location匹配再跳转
2.rewrite生效的位置
rewrite只能放在server( ),location( },if( }中,并且默认只能对域名后边的除去传递的参数外的字符串起作用。
location只对域名后边的除去传递参数外的字符串起作用
例如:www.baidu.com/bbs/install/index.php
location只对/bbs/install/index.php起作用
3.对域名或参数字符串
(1)使用if全局变量匹配
(2)使用proxy_pass反向代理
五.nginx正则表达式
字符说明:
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次
+ :匹配前面的字符一次或多次
? :匹配前面的字符零次或一次
. :匹配除"\n"之外的任何单个字符,若要匹配包括"\n"在内的任意字符,请使用诸如"[.\n]"之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如"\n"匹配一个换行符,而""\$"则匹配"$"
\d :匹配纯数字
\w :匹配字母或数字或下划线或汉字
\s : 匹配任意的空白符
\b : 匹配单词的开始或结束
{n} :重复n次
{n,} :重复n次或更多次
{n,m} :重复n到m次
[] :定义匹配的字符范围
[c]: 匹配单个字符 c
[ a-z] :匹配a-z小写字母的任意一个
[ a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置例如:(jpg|gif|swf|)
| :或运算符
六.rewrite执行的顺序
1.执行server 模块里面的rewrite 指令。
2.执行选定的location 中的rewrite 指令。
3.执行选定的location中 if中的rewrite指令。
说明:
http {
server {
rewrite #优先级1
location ~*.(jpgIgif|swf)$ {
rewrite #优先级2
valid_ referers none blocked *.dog.com dog.com;
if ( $invalid referer ) {
rewrite ^/ http: L /www. dog. com/error.png; #优先级3
}
}
}
}
七.rewrite命令
1.命令语法
rewrite <regex> <replacemnt> [flag];
说明:
regex:表示正则匹配规则。
replacement:表示跳转后的内容。
flag:表示rewrite 支持的flag标记。
2.flag标记说明
last:相当于Apache的以标记,表示完成rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302 临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
3.last和break比较
(1)使用场景
last一般写在server和if中
break一般使用在location中
(2)URL匹配
last不终止重写后的url匹配
break终止重写后的url匹配
八.location分类
1.location分类
精准匹配:location = / {…}
示例:location = patt {}
表示精确匹配字符串
一般匹配:location / {…}
示例:location patt {}
表示只要包含patt的字符串即可
正则匹配: location ~ / {…}
示例:location~patt{}
表示按照正则表达式的方式匹配
~:表达的意思首先是可以支持正则表达式,其次是区分大小写
2.location的优先级
相同类型的表达式,字符串长的会优先匹配
按照优先级排列
(1)=:精确匹配
(2)^~:前缀匹配
(3) ~ 和~*:按文件中的顺序的正则匹配;这里区分匹配是文件还是目录
文件:~ * 优先级高于 ~
目录:~优先级高于 ~ *
(4)普通匹配:以xxx路径为前缀的匹配
(5) /:通用匹配
3.rewrite和location的比较
(1)相同点:都能实现跳转
(2)不同点:
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以 proxy_ pass到其他机器
(3)rewrite会写在location里,执行顺序
执行server块里面的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
九.实际网站中使用的3个匹配规则
1.第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁(www.baidu.com/),使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器.
location = / {
root html ;
index index.html index.htm;
}
2.第二个必选规则
是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其–或搭配使用
location ^~ /static/ {
root /webroot/static/ ;
}
location ~* \. (html|gif|jpg|jpeglpnglcssljslico)$ {
root /webroot/res/ ;
}
3.第三个规则
是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器,非静态文件请求就默认是动态请求,即跳转或反向代理
upstream tomcat_ server {
192.168.226.7:80
192.168.226.100:80
location / {
proxy_ pass http: //tomcat_server;
}
十.rewrite跳转的实例
1.基于域名的跳转
应用场景:旧域名业务变更不能废除,需要跳转到新的域名
旧域名:www.koko.com
新域名:www.momo.com
(1)本地添加映射
[root@server ~]# vim /etc/hosts
(2)创建日志目录
[root@server ~]# mkdir -p /var/log/nginx/
(3)修改配置文件
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
(4)检查语法重启服务
[root@server ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server ~]# systemctl restart nginx
(5)网页访问域名验证
① 访问旧域名www.koko.com 会自动跳转到www.momo.com
② 访问www.koko.com/1.html 会自动跳转到www/momo.com/1.html
2.基于IP地址的跳转
应用场景:业务升级更新,除了本地192.168.206.77,其他所有IP访问都跳转到维护页面
(1)创建维护页面
[root@server ~]# mkdir -p /var/www/html
[root@server ~]# vim /var/www/html/weihu.html
(2)修改配置文件
// An highlighted block
var foo = 'bar';
(3)检查语法重启服务
[root@server ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server ~]# systemctl restart nginx
(4)网页验证
① 本地访问
②其他访问
3.基于旧域名跳转到新域名后面加目录
访问bbs.koko.com/post/1.html时会自动跳转到www.momo.com/post/1.html
(1)添加映射
[root@server ~]# vim /etc/hosts
(2)创建指定目录并写页面内容
[root@server ~]# mkdir -p /usr/local/nginx/html/bbs/post
[root@server ~]# vim /usr/local/nginx//html//bbs/post/1.html
(3)修改配置文件
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
(4)重启服务
[root@server ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server ~]# systemctl restart nginx
(5)网页验证
访问bbs.koko.com/post/1.html时会自动跳转到www.momo.com/post/1.html
4.基于参数匹配(多余的)的跳转
访问www.kokocom/100-(100|200)-100.html会跳转到http://www.koko.com的页面
(1)修改配置文件
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf
(2)重启服务打开网页访问验证
① 访问www.kokocom/100-100-100.html会跳转到http://www.koko.com的页面
② 访问www.kokocom/100-200-100.html会跳转到http://www.koko.com的页面
③ 访问www.kokocom/100-200-89757.html会跳转到http://www.koko.com的页面
5.基于目录下所有php结尾的文件跳转
应用场景:一般用于跳转注册页面
访问www.koko.com/upload/123.php会自动跳转到首页www.koko.com
(1)修改配置文件
(2)重启服务打开网页验证
访问www.koko.com/upload/123.php会自动跳转到首页www.koko.com
6.基于最普通一条url请求的跳转
访问一条url跳转
访问www.koko.com/abc/123.html跳转到首页www.koko.com
(1)修改配置文件
(2)重启服务访问页面认证
访问www.koko.com/abc/123.html跳转到首页www.koko.com
十一.总结
这里主要介绍了nginx中rewrite跳转以及一些跳转实例分析。