nginx的rewite階段主要進(jìn)行l(wèi)ocation的匹配和重定向
其中主要有這幾個(gè)指令需要了解:return诸迟、rewrite和if
兩者都可出現(xiàn)在location和server塊下
1.return指令
return code [URI/text] / URI;
如return 200 '$remote_addr' 返回200狀態(tài)碼
當(dāng)然return 指令也可用于重定向
這里需要了解重定向狀態(tài)碼
301 永久重定向
302 臨時(shí)重定向茸炒,禁止被緩存
303 臨時(shí)重定向,允許改變方法,禁止被緩存
307 臨時(shí)重定向,不允許改變方法阵苇,禁止被緩存
308 永久重定向
關(guān)于臨時(shí)重定向和永久重定向 http://www.reibang.com/p/2dc79de7da3a
error_page和return
error_page語(yǔ)法
error_page code [=URI] 即出現(xiàn)指定code時(shí)才進(jìn)行重定向
實(shí)驗(yàn):
情況1.當(dāng)return和error_page都出現(xiàn)在server塊時(shí)
nginx配置(404意思為訪(fǎng)問(wèn)資源不存在壁公,405意思為訪(fǎng)問(wèn)的請(qǐng)求方式錯(cuò)誤)
error_page 404 405 /404.html;
return 405 'is 405\n';
location / {
#return 200 '$remote_addr\n';
}
curl 127.0.0.1 和 curl 127.0.0.1/aaa.txt(一個(gè)不存在的文件,即404錯(cuò)誤)
結(jié)果: is 405
總結(jié)error_page和return 在同一快下慎玖,即使出錯(cuò)也還是以retun為主
情況2.當(dāng)return和error_page都出現(xiàn)贮尖,但在不同塊下
nginx配置
error_page 404 405 /404.html;
#return 405 'is 405\n';
location /test {
return 200 'is 200\n';
}
執(zhí)行命令
curl 127.0.0.1/aaa.txt(一個(gè)不存在的文件)
結(jié)果是返回了404.html的內(nèi)容
curl 127.0.0.1/test/aaa.txt(一個(gè)不存在的文件)
結(jié)果 is 200
總結(jié) return是大哥
2.rewrite指令
語(yǔ)法
rewrite regex replacement [flag];
#將regex替換為replacement,可以用正則提取變量
注意:當(dāng)replacement以httlp://或https://或$schema開(kāi)頭直接進(jìn)行302重定向
實(shí)驗(yàn)1
nginx server塊下配置如下
rewrite /1.txt /2.txt;
#html目錄下有1.txt和2.txt內(nèi)容分別為1和2
curl 127.0.0.1/1.txt
結(jié)果為2
查看響應(yīng)頭部 curl 127.0.0.1/1.txt -I
響應(yīng)碼為200
修改配置
rewrite /1(.*) http://你的ip/2$1;
# 此時(shí)訪(fǎng)問(wèn)/1.txt時(shí) $1 = .txt 即訪(fǎng)問(wèn) /2.txt
curl 訪(fǎng)問(wèn) 響應(yīng)碼為302趁怔,瀏覽器顯示結(jié)果為2
關(guān)于flag
nginx配置如下
location /first {
rewrite /first(.*) /second$1 last;
return 200 'is 1\n';
}
location /second {
rewrite /second(.*) /third$1 break;
return 200 'is 2\n';
}
location /third {
return 200 'is 3\n';
}
其中html目錄樹(shù)如下
├── first
│ └── 1.txt //1
├── index.html
├── index.php
├── second
│ └── 1.txt //2
└── third
└── 1.txt //3
flag = --last
表示會(huì)用replacement這個(gè)URI重新進(jìn)行l(wèi)ocation匹配湿硝,響應(yīng)碼為200
--break 停止當(dāng)前腳本指令執(zhí)行
--redirect 響應(yīng)碼為302,同理last
--permanent響應(yīng)碼為301润努,同理last
分別進(jìn)行curl 127.0.0.1/first/1.txt 和 curl 127.0.0.1/first/1.txt -I
響應(yīng)碼200 結(jié)果為 3
分析:
/first/1.txt 被重定向到 /second/1.txt 因?yàn)闉閘ast,再進(jìn)行一次location匹配关斜,而后又被重定向成立/third/1.txt,因?yàn)闉閎reak此時(shí)后面的代碼不再執(zhí)行 铺浇,同時(shí)停止匹配直接去thrid下找1.txt文件
flag加不加的區(qū)別
修改nginx配置
location /second {
rewrite /second(.*) /third$1 ; //去掉break或last
return 200 'is 2\n';
}
curl 127.0.0.1/first/1.txt
結(jié)果為 is 2;即return 200 'is 2\n';繼續(xù)被執(zhí)行
特殊情況:當(dāng)replacement為http等開(kāi)頭時(shí)痢畜,后面也不執(zhí)行
關(guān)于日志
rewrite_log on 開(kāi)啟時(shí)重定向日志會(huì)被記錄到err.log中
rewrite_log on;
error_log logs/rewrite_error.log notice;
3.if指令
與編程的指令一樣邏輯,基于變量執(zhí)行
內(nèi)置變量官方文檔
nginx內(nèi)置變量:https://blog.csdn.net/Dream_be_L/article/details/95047006
if常用判斷邏輯:https://www.cnblogs.com/songxingzhu/p/6382007.html
location / {
if ($request_method = GET){
return 405;
}
return 200 'hi\n';
}
#如使用GET方法訪(fǎng)問(wèn)直接返回405錯(cuò)誤
注意w⒙隆6∠ ! if 和 ( 中間需要 空格R芯邸O呱馈!
拓展
關(guān)于響應(yīng)碼301/302/303
301表示永久重定向惑折,此次資源已經(jīng)不存在了需要改用新的資源(如文件夾的移動(dòng),http到https的升級(jí))
302表示臨時(shí)重定向授账,資源還在枯跑,但暫時(shí)需要用另一個(gè)url訪(fǎng)問(wèn)(如未登錄重定向到login),因?yàn)槭桥R時(shí)的所以禁止被緩存
兩者都會(huì)在http頭部增加一個(gè)location字段表示新的url
303/307/308都是HTTP1.1標(biāo)準(zhǔn)中新增的
303表示臨時(shí)重定向白热,允許改變方法
307臨時(shí)重定向敛助,不允許改變方法
308永久重定向,不允許改變方法
304比較特殊它用于 If-Modified-Since 等條件請(qǐng)求
表示訪(fǎng)問(wèn)的資源未被修改屋确,用于緩存控制纳击,表示已經(jīng)重定向到緩存的文件(即緩存重定向)