需求:研发偶尔提出一些路由跳转需求。
解决问题:业务及研发无法处理的时候,需要运维这边辅助路由规则。
实现方法:nginx rewrite
知识了解:
正则表达式匹配
~ 区分大小写匹配
~* 不区分大小写匹配
!~区分大小写不匹配
!~*不区分大小写不匹配
rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种:
last :相当于Apache里德(L)标记,表示完成rewrite;
break;本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
last和break用来实现URL重写,浏览器地址栏URL地址不变
$host: 存放了请求url中的主机字段,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的www.myweb.name。如果请求中的主机部分字段不可用或者为空,则存放nginx配置中该server块中server_name指令的配置值
$requset_uri 当前请求的uri,并且带有指令
$query_string $args含义相同
$server_addr 服务器的地址
$server_name 客户端请求到达的服务器的名称
$request_method 存放了客户端的请求方式,如get,post等
$document_uri 请求中的uri,不包含请求指令 ,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的/server/source
$args 存放了请求url中的请求指令。比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的arg1=value1&arg2=value2
案例一:http跳到https
解决:
server {
rewrite ^(.*)$ https://$host$1 permanent;
}
案例二: 测试域名跳到正式域名
http://www-t.lemon.cn的访问 跳转到 http://www.lemon.cn
解决:
if ($host ~* ^www-t.mallcoo.cn$) {
rewrite ^(.*)$ http://www.lemon.cn$1 permanent;
}
案例三: 访问单域名跳转到指定目录
解决:
if ($host ~* ^www.lemon.cn$) {
rewrite ^/$ http://$host/zabbix/;
}
案例四:(链接带问号的跳转)
http://www.lemon.cn/test/p?gid=8488&_mid=127 重定向到:http://www.lemon.cn/user/usercenter?_mid=127
解决:
if ( $request_uri ~* "^/test/p\?gid=8488&_mid=(\d+)") {
set $myarg1 $1;
rewrite .* http://www.lemon.cn/user/usercenter?_mid=$myarg1? permanent;
}
案例五:(链接带问号的跳转)
http://www.abc.com/a/b?id=123 的一条链接转换成 http://www.abc.com/p-123.html
解决:
if ($request_uri ~* "^/a/b\?id=(\d+)$") {
set $myarg1 $1;
rewrite .* http://www.abc.com/p-$myarg1.html? permanent;
}
来源:51CTO
作者:悠悠子濛
链接:https://blog.51cto.com/mengsir/2097547