Nginx之Rewrite
date
May 19, 2022
slug
dtftesdp
status
Published
tags
Nginx
summary
type
Post
rewrite 规则可以实现对 url 的重写和重定向,支持 if 条件判断但不支持 else,nginx rewrite 官网。
语法
server {
rewrite {正则规则} {定向路径} {重写类型};
}
重写类型有:
- last:本条规则匹配完成后,继续向下匹配新的 location URL 规则,一般用在 server 和 if 中。浏览器地址栏不变
- break:本条规则匹配完成后,终止匹配,不再匹配后面的规则。浏览器地址栏不变
- redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址。
- permanent:返回 301 永久重定向,浏览器地址会显示跳转后的 URL 地址。
常用的正则表达式
- ^∶ 匹配输入字符串的起始位置
- $ ∶ 匹配输入字符串的结束位置
- _∶ 匹配前面的字符零次或多次。如“ol_”能匹配“o”及“ol”、“oll”
- ∶ 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
- ?∶ 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?”等效于“{0.1}”
- .∶ 匹配除“”之外的任何单个字符,若要匹配包括“”在内的任意字符,请使用诸如“{.}”之类的模式
- ∶ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“”匹配一个换行符,而“$"则匹配"$”
- 匹配纯数字
- ∶ 匹配任意空字符,空格或 Tab 符
- {n}∶ 重复 n 次
- {n,}∶ 重复 n 次或更多次
- {n,m}∶ 重复 n 到 m 次
[ ]∶ 定义匹配的字符范围
- [c]∶ 匹配单个字符 c
- [a-z]∶ 匹配 a-z 小写字母的任意一个
- [a-zA-Z0-9]∶ 匹配所有大小写字母或数字
- ( )∶ 表达式的开始和结束位置
- |∶ 或运算符
执行顺序如下:
- 1.执行 server 块里面的 rewrite 指令。
- 2.执行 location 匹配。
- 3.执行选定的 location 中的 rewrite 指令。
其他
常见的 rewrite 全局变量:
- $host:代表请求主机头字段或主机名
- $remote_addr:代表客户端 IP
- $request_uri∶ 包含请求参数的原始 URI,不包含主机名,如
http://www.bennet.com/abc/index.html?a=1&b=2中的/abc/index.php?a=1&b=2
- $uri∶ 这个变量指当前的请求 URI,不包括任何参数,如 ∶/abc/index.html
- documentri ∶ 与uri 相同,这个变量指当前的请求 URI,不包括任何传递参数,如 ∶/abc/index.html
u
- $1∶ 一般用在 if 语句中代表前面 rewrite 正则表达式里匹配的内容,一般用在 location 中代表 location 后面的位置变量
1、http 跳转 https
server {
listen 80;
server_name abc.com;
location ^~ / {
rewrite ^(.*)$ https://$host$1 permanent;
}
}
2、基于旧域名跳转到新域名后面加目录
# /post跳转到/bbs/post
location /post {
rewrite ^(.*)$ $scheme://$host/bbs$1 permanent; #这里的$1为位置变量,代表/post
}
3、渠道统计
服务器提供一个接口 /api/v1/access, 终端用户可以通过浏览器、公众号、App 访问。想要根据不同的渠道统计访问数,我们在终端调用接口的时候各自分配一个数字。
- 浏览器页面:10000
- 公众号内页面:20000
- App 页面操作:30000
location ~/([0-9]+)/(.*)$ {
rewrite /([0-9]+)/(.*)$ /$2 break;
proxy_pass http://127.0.0.1:9090;
}
$2 表示路径中正则表达式匹配的第二个参数,也就是 (.*) 这部分,最后终端的接口就变成如
/10000/api/v1/access
,最后 nginx 将请求记录同步到如 ELK(Elasticsearch-Logstash-Kibana) 方案中就完成了统计。参考资料: