nginx rewrite語法
rewrite regex replacement [flag];
- regex: 是 PCRE 語法格式的正則表達(dá)式,用于匹配字符串戏自。
- replacement: 是重寫 URI 的改寫規(guī)則件豌。當(dāng)改寫規(guī)則以"http://""https://"或"$scheme"開頭時(shí)浸颓,Nginx 重寫該語句后將停止執(zhí)行后續(xù)任務(wù)捎稚,并將改寫后的 URI 跳轉(zhuǎn)返回客戶端碧聪。
- flag: 是執(zhí)行該條重寫指令后的操作控制符翠储。操作控制符有如下 4 種:
- break: 執(zhí)行完當(dāng)前重寫規(guī)則跳轉(zhuǎn)到新的 URI 后不再執(zhí)行后續(xù)操作什猖。不影響用戶瀏覽器 URI 顯示。
- last: 執(zhí)行完當(dāng)前重寫規(guī)則跳轉(zhuǎn)到新的 URI 后繼續(xù)執(zhí)行后續(xù)操作素邪。
- redirect: 返回響應(yīng)狀態(tài)碼 302 的臨時(shí)重定向外莲,返回內(nèi)容是重定向 URI 的內(nèi)容,但瀏覽器網(wǎng)址仍為請(qǐng)求時(shí)的 URI;
- 返回響應(yīng)狀態(tài)碼 301 的永久重定向偷线,返回內(nèi)容是重定向 URI 的內(nèi)容磨确,瀏覽器網(wǎng)址變?yōu)橹囟ㄏ虻?URI。
下面一個(gè)例子將本地63561代理到nginx代理80端口上声邦,并且所有URL上添加/prefix
前綴乏奥。
location /prefix/ {
rewrite ^/prefix/(.*)$ /$1 break;
proxy_pass http://localhost:63561;
}
原來URL http://localhost:63561/aaa => localhost/prefix/aaa
雖然在nginx添加了如下配置,可不一定生效哦亥曹,這里就要講下nginx URI 匹配規(guī)則
URI 匹配規(guī)則
location Modifier pattern { ... }
Modifier為location的修飾語邓了,定義URI的匹配規(guī)則。pattern 為匹配項(xiàng)歇式,可以是字符串或正則表達(dá)式
- 沒有修飾符: 從指定模式開始驶悟,只支持字符串
location /abc{
root text;
}
下面規(guī)則都匹配:
http://localhost/abc/sdssd
http://localhost/abc?page=1&size=10
http://localhost/abcd
http://localhost/abc/
-
=
: 完全匹配 URI 中除訪問參數(shù)以外的內(nèi)容,Linux 系統(tǒng)下會(huì)區(qū)分大小寫材失,Windows 系統(tǒng)下則不會(huì)痕鳍。
location = /test {
root text;
}
下面都匹配
http://localhost/test
http://localhost/test?page=1&size=10
不匹配
http://localhost/test2ds
http://localhost/test/
-
~
: 區(qū)分大小寫的正則匹配
location ~ /abc$ {
root text;
}
下面都匹配
http://localhost/abc
http://localhost/abc?p=123
不匹配
http://localhost/abc/
http://localhost/ABC
http://localhost/abc/bbd
-
~*
: 不區(qū)分大小的正則匹配
location ~* /abc$ {
root text;
}
下面都匹配
http://localhost/abc
http://localhsot/ABC
http://localhost/abc?p=123
不匹配
http://localhost/abc/
http://localhost/abc/bbd
-
^~
: 作用類似沒有修飾符的前綴匹配,nginx對(duì)一個(gè)請(qǐng)求精確前綴匹配成功后龙巨,停止繼續(xù)搜索其他到匹配項(xiàng)笼呆,支持正則表達(dá)式。
location ^~ /abc {
root text;
}
-
@
: 只能內(nèi)部訪問的 location 區(qū)域旨别,可以被其他內(nèi)部跳轉(zhuǎn)指令使用
location @images {
proxy_pass http://images;
}
匹配順序
- 先檢測(cè)匹配項(xiàng)的內(nèi)容為非正則表達(dá)式修飾語的 location诗赌,然后再檢測(cè)匹配項(xiàng)的內(nèi)容為正則表達(dá)式修飾語的 location。
- 匹配項(xiàng)的內(nèi)容為正則與非正則都匹配的 location秸弛,按照匹配項(xiàng)的內(nèi)容為正則匹配的 location 執(zhí)行铭若。
- 所有匹配項(xiàng)的內(nèi)容均為非正則表達(dá)式的 location,按照匹配項(xiàng)的內(nèi)容完全匹配的內(nèi)容長(zhǎng)短進(jìn)行匹配递览,即匹配內(nèi)容多的 location 被執(zhí)行叼屠。
- 所有匹配項(xiàng)的內(nèi)容均為正則表達(dá)式的 location,按照書寫的先后順序進(jìn)行匹配绞铃,匹配后就執(zhí)行镜雨,不再做后續(xù)檢測(cè)。