前言
现在Nginx已经成为很多公司作为前端反向代理(proxy_ pass) 服务器的首选,在实际工作中往往会遇到很多跳转( 重写URL)的需求。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的Apache 服务器,虽然也能做跳转,规则库也很强大,但是用Nginx 跳转效率会更高
一、Rewrite实际场景
1、配置跳转的原因
- 为了让URL看起来更规范、合理
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,期望用户可以通过旧的访问跳转到新的域名上
- 服务端某些业务调整
2、Nginx跳转需求的实现方式
- 使用rewrite进行匹配跳转(主要匹配的是具体的路径)
- 使用if匹配全局变量后跳转,结合布尔值时间true和fales的跳转
- 使用location匹配再跳转(可以匹配后执行proxy_pass,将请求跳转到其他服务上)
3、rewrite如何实现跳转
- nginx服务基于http协议rewrite重写mudule模块
- nginx:主从URL重写,其中有一个布尔值:返回值的结果只有true或者false;同时特性:只支持if单分支语句
- 跳转:循环最多可以执行10次,超过后nginx将返回500错误
- PCRE支持:perl兼容正则表达式的语法规则匹配
- 重写模块set指令:自己设置即可以使用布尔值
如下:标志位参数:$1:具体的路径,即标志位
www.baidu.com/bbs/install/index.php ##URL
www.baidu.com ##URI $0
/bbs/install/index.php ## $1
3、rewrite功能
- rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
- 比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求
4、rewrite生效位置
- rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
- 例如http:/ /www . dabao. com/a/we/ index。php?id=1&u=str 只对/a/we/ index . php重写
- 例如http:/ /www . dabao. com/a/we/ index。php?id=1&u=str 只对/a/we/ index . php重写
5、rewrite 执行顺序
- 执行server 模块里面的rewrite 指令。
- 执行选定的location 中的rewrite 指令。
- 执行选定的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
}
}
}
}
6、对域名或参数字符串
- 使用if全局变量匹配
- 使用proxy_ _pass反向代理
- 把服务端的请求交给后面的服务处理
首先ip地址定位,如何定位,
- 把服务端的请求交给后面的服务处理
upstream apache_server { ##定义的是动态处理服务的地址池
apache-1_ip:端口
apache-2_ip:端口
}
通过location内的正常匹配去调用apache_server
location {
proxy_pass apache_server
}
apache_server:是一个函数,是可以自定义**_server,需要upstream和location名字一致
二、Nginx正则表达式
1、字符说明
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符0次或多次