一 前言
URL重写是网站为了实现个性化配置满足自己业务需要必须要做的事情,URL重写是通过Nginx的ngx_http_rewrite_module来实现。
二 rewrite模块包含的指令
1.return 指令
return指令作用是直接返回,停止后续的处理,其返回的类别有三种。分别为code+url, code+text, url。
例子:
server { listen 127.0.0.1:8083; server_name localhost; location / { return 200 "hello baby"; }
重启nginx
sudo ./nginx -s reload
curl测试
hello baby[syz@syz-x542un sbin]$ curl 127.0.0.1:8083 hello baby[syz@syz-x542un sbin]$ curl -i 127.0.0.1:8083 HTTP/1.1 200 OK Server: nginx/1.18.0 Date: Tue, 06 Apr 2021 02:10:30 GMT Content-Type: application/octet-stream Content-Length: 10 Connection: keep-alive
2. rewrite指令
rewrite指令使用的是正则表达式来匹配URL,然后重写URL,同时rewrite指令包含了四个标志位,分别为break,last, redirect, permanent。
rewrite的执行顺序:
1)根据rewrite指令在server中出现的顺序逐个执行,确定该server级别的全部rewrite执行后得到的最终URL.
2)循环执行以下步骤:
1.根据URL来找到匹配的location
2.按照rewrite指令在location级别下出现的顺序逐个执行
3.如果上一步中对URL进行了重写,并且使用last标志位,那么重复执行第2步骤,最多重复执行10次
例子:
server { listen 127.0.0.1:8081; server_name localhost; location /first { rewrite /first/(.*) /second/$1 last; return 200 "hello first\n"; } location /second { rewrite /second/(.*) /third/$1; return 200 "hello second\n"; } location /third { return 200 "hello third\n"; } }
结果
[syz@syz-x542un sbin]$ curl http://127.0.0.1:8081/second/w.txt hello second
rewrite执行流程分析:
1.首先请求http://127.0.0.1:8081/second/w.txt,按照顺序被第一个location匹配成功,然后执行rewrite进行url重写,重写后追加标志位
last。
2.接下来搜索与/second/$1相匹配的location,被第二个location捕获,然后进行rewrite重写,此时后面没有追加任何标志位,则执行到return处返回其后内容, hello second
PS:上述过程执行了两次rewrite,last标志位表示停止处理当前的ngx_http_rewrite_module的指令集,并开始搜索与更改后的url匹配的location。
如果我第二个location后增加break标志位,会是什么结果呢?
server { listen 127.0.0.1:8081; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /first { rewrite /first/(.*) /second/$1 last; return 200 "hello first\n"; } location /second { rewrite /second/(.*) /third/$1 break; return 200 "hello second\n"; } location /third { return 200 "hello third\n"; } }
测试结果:
[syz@syz-x542un sbin]$ curl http://127.0.0.1:8081/second/3.txt <html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.18.0</center> </body> </html>
由于添加了break标志位,表示停止处理当前级别下的ngx_http_rewrite_module的指令集,于是并不会执行return,而是根据url去搜索对应文件下是否存在匹配的文件。因此现在我在/third文件中添加一个3.txt文件并写入内容,再来查看效果。
[syz@syz-x542un sbin]$ curl http://127.0.0.1:8081/second/3.txt nihao, my name is thrid-3