nginx中rewrite和if的使用及配置方式
一、rewrite應(yīng)用
rewrite語法
rewrite <正則表達(dá)式> <跳轉(zhuǎn)后的內(nèi)容> [rewrite支持的flag標(biāo)記]
1、rewrite跳轉(zhuǎn)場景
- URL看起來更規(guī)范、合理
- 企業(yè)會(huì)將動(dòng)態(tài)URL地址偽裝成靜態(tài)地址提供服務(wù)
- 網(wǎng)址換新域名后,讓舊的訪問跳轉(zhuǎn)到新的域名上
- 服務(wù)端某些業(yè)務(wù)調(diào)整
2、rewrite實(shí)際場景
1.3.1 Nginx跳轉(zhuǎn)需求的實(shí)現(xiàn)方式
- 使用rewrite進(jìn)行匹配跳轉(zhuǎn)
- 使用if匹配全局變量后跳轉(zhuǎn)
- 使用location匹配再跳轉(zhuǎn)
1.3.2 rewrite放在server{},if{},location{}段中
- location只對域名后邊的除去傳遞參數(shù)外的字符串起作用
1.3.3 對域名或參數(shù)字符串
- 使用if全局變量匹配
- 使用proxy_pass反向代理
3、常用的nginx正則表達(dá)式
^:匹配輸入字符串的起始位置
$:匹配輸入字符串的結(jié)束位置
*****:匹配前面的字符零次或多次
+:匹配前面的字符一次或多次
?:匹配前面的字符零次或一次
.:匹配除\n之外的任何單個(gè)字符 使用[.\n]可以匹配包括\n在內(nèi)的任意字符
****:轉(zhuǎn)義符
\d:匹配純數(shù)字
{n}:重復(fù)n次
{n,}:重復(fù)n次或更多次
[c]:匹配單個(gè)字符c
[a-z]:匹配a-z小寫字母的任意一個(gè)
[a-zA-Z]:匹配a-z小寫字母或A-Z大寫字母的任意一個(gè)
4、常見的flag
| flag | 作用 |
|---|---|
| last | 基本上都用這個(gè)flag,表示當(dāng)前的匹配結(jié)束,繼續(xù)下一個(gè)匹配,最多匹配10個(gè)到20個(gè) 一旦此rewrite規(guī)則重寫完成后,就不再被后面其它的rewrite規(guī)則進(jìn)行處理 而是由UserAgent重新對重寫后的URL再一次發(fā)起請求,并從頭開始執(zhí)行類似的過程 |
| break | 中止Rewrite,不再繼續(xù)匹配 一旦此rewrite規(guī)則重寫完成后,由UserAgent對新的URL重新發(fā)起請求, 且不再會(huì)被當(dāng)前l(fā)ocation內(nèi)的任何rewrite規(guī)則所檢查 |
| redirect | 以臨時(shí)重定向的HTTP狀態(tài)302返回新的URL |
| permanent | 以永久重定向的HTTP狀態(tài)301返回新的URL |
last和break在重定向后,地址欄都不會(huì)發(fā)生變化,這是它們的相同點(diǎn),不同點(diǎn)在于last會(huì)寫在server和if中,break是寫在location中,last不會(huì)終止重寫后的url匹配,break會(huì)終止重寫后的url匹配。
5、案例配置
rewrite重寫flag
rewrite主要是用來重寫URL或者跳轉(zhuǎn)URL的指令
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
root /hhh/xxx;
location / {
rewrite /1.html /2.html;
rewrite /2.html /3.html;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html {
rewrite /3.html /b.html;
}
[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@nginx ~]# systemctl restart nginx
[root@nginx ~]# mkdir -p /hhh/xxx
[root@nginx ~]# echo "web1" > /hhh/xxx/1.html
[root@nginx ~]# echo "web2" > /hhh/xxx/2.html
[root@nginx ~]# echo "web3" > /hhh/xxx/3.html
[root@nginx ~]# echo "web a" > /hhh/xxx/a.html
[root@nginx ~]# echo "web b" > /hhh/xxx/b.html
[root@nginx ~]# curl 192.168.183.138/1.html
web b
當(dāng)請求1.html時(shí),最終會(huì)訪問到web b
在location{}內(nèi)部,遇到break,本location{}內(nèi)以及后面的所有location{}內(nèi)的所有指令都不再執(zhí)行,所以至跳轉(zhuǎn)到2.html訪問到web2
location / {
rewrite /1.html /2.html break;
rewrite /2.html /3.html;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html {
rewrite /3.html /b.html;
}
[root@nginx ~]# curl 192.168.183.138/1.html
web2
在location{}內(nèi)部,遇到last,本location{}內(nèi)后續(xù)指令不再執(zhí)行,而重寫后的url會(huì)對所在的server{…}標(biāo)簽重新發(fā)起請求,從頭到尾匹配一遍規(guī)則,哪個(gè)匹配則執(zhí)行哪個(gè)。
location / {
rewrite /1.html /2.html last;
rewrite /2.html /3.html;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html {
rewrite /3.html /b.html;
}
[root@nginx ~]# curl 192.168.183.138/1.html web a
二、if應(yīng)用
1、if語句中的判斷條件
正則表達(dá)式匹配
- ==:等值比較;
- ~:與指定正則表達(dá)式模式匹配時(shí)返回“真”,判斷匹配與否時(shí)區(qū)分字符大小寫;
- ~*:與指定正則表達(dá)式模式匹配時(shí)返回“真”,判斷匹配與否時(shí)不區(qū)分字符大小寫;
- !~:與指定正則表達(dá)式模式不匹配時(shí)返回“真”,判斷匹配與否時(shí)區(qū)分字符大小寫;
- !~*:與指定正則表達(dá)式模式不匹配時(shí)返回“真”,判斷匹配與否時(shí)不區(qū)分字符大小寫
2、文件及目錄匹配判斷
- -f, !-f:判斷指定的路徑是否為存在且為文件;
- -d, !-d:判斷指定的路徑是否為存在且為目錄;
- -e, !-e:判斷指定的路徑是否存在,文件或目錄均可;
- -x, !-x:判斷指定路徑的文件是否存在且可執(zhí)行;
3、基于瀏覽器實(shí)現(xiàn)分離案例
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /chrome/$1 break;
}
4、防盜鏈案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用nginx+lua進(jìn)行token鑒權(quán)的方法
使用nginx和lua腳本實(shí)現(xiàn)對Minio服務(wù)器圖片鏈接的token鑒權(quán),通過反向代理隱藏真實(shí)IP,增強(qiáng)安全性,介紹了整個(gè)鑒權(quán)流程,包括nginx配置和lua腳本的具體實(shí)現(xiàn),適用于需要保護(hù)圖片不被未授權(quán)訪問的場景2022-05-05
銀河麒麟(Kylin)離線安裝Nginx并部署多服務(wù)完整步驟
這篇文章主要介紹了銀河麒麟(Kylin)離線安裝Nginx并部署多服務(wù)的相關(guān)資料,包括依賴包下載、HTTPS配置、多端口站點(diǎn)部署等步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-02-02
nginx rewrite重寫規(guī)則與防盜鏈配置方法教程詳解
這篇文章主要介紹了nginx rewrite重寫規(guī)則與防盜鏈配置方法教程詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
詳解Prometheus 抓取 nginx 訪問日志的指標(biāo)
通過結(jié)合NGINX Exporter, Fluentd, Prometheus和Grafana, 可有效監(jiān)控并可視化NGINX中的4xx和5xx狀態(tài)碼日志,首先使用Fluentd收集和解析NGINX日志,再通過Prometheus抓取Fluentd暴露的指標(biāo),本文介紹Prometheus抓取nginx訪問日志的指標(biāo),感興趣的朋友一起看看吧2024-10-10
Nginx實(shí)現(xiàn)自簽名SSL證書生成與配置實(shí)現(xiàn)
本文主要介紹了Nginx實(shí)現(xiàn)自簽名SSL證書生成與配置實(shí)現(xiàn),文章將詳細(xì)介紹生成自簽名SSL證書的步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
nginx+uwsgi啟動(dòng)Django項(xiàng)目的詳細(xì)步驟
nginx+uwsgi+django是我們常用的django部署方式。這篇文章主要介紹了nginx+uwsgi啟動(dòng)Django項(xiàng)目的詳細(xì)步驟,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
nginx 常用指令 try_files allow root ali
本文主要介紹了nginx 常用指令 try_files allow root alias的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08

