Nginx URLRewrite
URLRewrite
rewrite语法格式及参数语法:
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,
重定向到replacement,结尾是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记
rewrite参数的标签段位置:
server,location,if
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
实例
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://127.0.0.1:8080;
}
负载均衡+URLRewrite
这是实际生产环境里边的服务器配置的图,我们配置了两台服务器,一共两台后端,有一台 tomcat,前面是一台 nginx, nginx 的 IP 地址是101,后边这个 tomcat 是 104。
在访问 104 的时候,通过 nginx代理,用 proxy_pass把请求代理到 104 上,同时把请求URL rewrite 。
现在访问正常的站点的时候,通过 nginx 才能够正常的访问,因为这个静态资源拷贝到这个 nginx 服务器上。
也就是现在这个站点想要正常访问的话,必须得通过这个101反向代理。101这台服务器是我们这台应用服务器的网关,那在真实的配置当中。这个104这台机器的 8080 端口是不应该被外网访问到的。想要访问我们这台应用服务器就必须得通过 101 才可以正常访问。我们来模拟一下。这台机器在真实的物理环境当中究竟是啥样的?
104是内网环境。这对外网是无法访问的。那同时在内网里边101是应该可以访问的。就是这两台机器,它必须得是互通的,那不通的话,它肯定不能代理,
那么接下来,通过这个防火墙的这种方式来模拟一下真实的这个环境。
我们把这台 tomcat 的防火墙启动起来,防火墙的命令如下
开启防火墙
systemctl start firewalld
重启防火墙
systemctl restart firewalld
重载规则
firewall-cmd --reload
查看已配置规则
firewall-cmd --list-all
指定端口和ip访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"
移除规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source
address="192.168.44.101" port port="8080" protocol="tcp" accept"
网关配置
upstream httpds {
server 192.168.44.102 weight=8 down;
server 192.168.44.104:8080 weight=1 backup;
}
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://httpds ;
}
License:
CC BY 4.0