nginx经常会碰到url重新(rewrite)。简单解释就是多个项目使用一个域名。需要根据不同的url前缀代理到不同的后端应用,或者将一个url跳转到另外的url。这些都可以通过nginx的rewrite功能来实现。即rewrite可以实现url的重写和重定向。
nginx的rewrite指令,需要安装nginx的时候安装ngx_http_rewrite_module模块,才能够实现url的重写和重定向
重写和重定向存在一些区别,简单来说。重写的话不会更改浏览器里具体的访问url,重定向则会跳转到新的url去
rewrite的语法:
rewrite [regex] [replacement] [flag];rewrite:关键字参数regex:正则表达式,匹配目标urlreplacement:将regex匹配到的内容替换成replacementflag:url的重写类型:
last:规则匹配完成后,继续向下匹配新的location url规则;浏览器中访问url地址不变;一般写在server和if中;
break:规则匹配完成后,则停止匹配后续的rewrite规则,浏览器中访问url地址不变;一般使用在location中;
redirect:返回302临时重定向,浏览器中访问地址会显示跳转后的url地址;
permanent:返回301永久重定向,浏览器中访问地址会显示跳转后的url地址;
rewrite和location的匹配顺序如下
首先匹配server段中的rewrite,然后在匹配location配置段,最后匹配location配置段里面的rewrite
几个常用例子
下面看几个介绍用法的例子:(为演示样例,不是完整的nginx配置)
server
{
listen 30888;
server_name 172.16.88.138;
#将http的所有访问调转到https。浏览器会更改成跳转后的url
rewrite (.*) https://172.16.88.138:30888 permanent;
}
这个是server段中的rewrite实例,也是比较常见的。当我们的nginx安装了ssl证书的时候,经常会使用到,用来将http协议访问跳转到https
location {
root data/www/test;
index index.html index.htm;
try_files $uri $uri/ index.html;
rewrite piibs/(.*)$ /$1 break;
}
location = piibs/ {
proxy_pass http://172.16.88.217:5601/;
rewrite piibs/api/(.*)$ /api/$1 break;
proxy_redirect off;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
下面这两个例子,都是location段内的rewrite。
第一个是当nginx作为web服务器,对url进行重写。当浏览器访问http://172.16.88.138:30888/piibs/index.html时,浏览器显示地址不变,浏览器实际显示内容为http://172.16.88.138:30888/index.html的内容。即完成了url的重写
第二个是nginx作为代理服务器代理应用时对url进行重写。当浏览器访问http://172.16.88.138:30888//piibs/api时,实际访问的是http://172.16.88.138:30888//api/。但浏览器url不变,还是显示的/piibs/api.当然对于浏览器里的url调转不调转是根据flag定义的类型决定。
通过上面的介绍,在实际运用中,我们需要根据不同的需求进行不同的配置和调整。当然这篇文章也是做了个大致介绍。具体灵活运用还是看个人啦。




