nginx 的 rewrite

其實(shí)nginx的rewrite模塊是在日常nginx配置中十分常用的模塊,應(yīng)該是除了 real_ip 模塊、匹配時(shí)用到的find_config模塊和前端資源配置的 static 模塊外的最常用的了吧。

Nginx的處理順序
nginx的處理順序是11 個(gè)模塊,處在realip模塊后的就是 rewrite 模塊了。而rewrite的模塊中的return一旦執(zhí)行就不會(huì)再處理接下來的模塊了。而rewrite 分兩部分。在 postread階段,rewrite -> find_config -> rewrite 這樣去執(zhí)行的。

Rewrite 模塊

return 指令

rewrite 模塊提供了一個(gè)指令 return 。
return 的語法可以是

return code [text];
return code URL;
return URL;

而再返回狀態(tài)碼上。

  • Nginx自定義
    • 444 關(guān)閉連接 (客戶端是收不到這樣的返回碼)
  • HTTP 1.0 標(biāo)準(zhǔn)
    • 301 http1.0 永久重定向 (會(huì)將 post方法變成 get)
    • 302 臨時(shí)重定向,禁止被緩存 (會(huì)將post方法變成 get)
  • HTTP 1.0 標(biāo)準(zhǔn)
    • 303 臨時(shí)重定向,允許改變方法,禁止被緩存
    • 307 臨時(shí)重定向,不允許改變方法,禁止被緩存
    • 308 永久重定向,不允許改變方法。
error_page 指令

error_page 指令是在發(fā)現(xiàn)錯(cuò)誤返回碼的時(shí)候重新定義返回的頁面.
這里需要知道 return 指令會(huì)先于 error_page 執(zhí)行。如果return指令被執(zhí)行到了,其他的指令都將無法被執(zhí)行。

1. error_page 404 /404.html;
2. error_page 500 502 503 504 /50x.html;
3. error_page 404 =200 /empty.gif;  (返回碼重新置為200)
4. error_page 404 = /404.php;
5. location / {
         error_page 404 = @fallback;
}
    location @fallback {
          proxy_pass http://backend;
}
6. error_page 403 http://example.com/forbidden.html;
7. error_page 404 =301 http://example.com/notfound.html;
rewrite 指令

rewrite 的語法是這樣的,可以通過 rewrite_log on; 記錄rewrite。

rewrite regex replacement [flag];
  • 將regex指定的url替換成 replacement 這個(gè)新的url。
  • 當(dāng)replacement以 http:// 或者 $schema 開頭,直接會(huì)返回302重定向。
  • 替換后的url根據(jù)flag指定的方式進(jìn)行處理。
    • last:用replacement這個(gè)url 重新進(jìn)行l(wèi)ocation匹配。
    • break:break指令停止當(dāng)前腳本的執(zhí)行,不再匹配。
    • redirect:返回302重定向。
    • permanent:返回301重定向。

具體的例子來訪問一下。
目錄的結(jié)構(gòu)為

file
├── first
│   └── 1.txt    # 1
├── second
│   └── 2.txt    # 2
└── third
    └── 3.txt    # 3

如下的配置

        root html/file/;
        location /first {
                rewrite /first(.*) /second$1 last;
                return 200 'first';
        }
        location /second {
                rewrite /second(.*) /third$1 break;
                return 200 'second';
        }
        location /third {
                return 200 'third';
        }

這里再重申一次,last表示匹配上后再匹配,break是中止往下執(zhí)行,如果第二個(gè)沒加 break的話,會(huì) return 200 的。

curl -H"Host:rewrite.example.wjx" http://127.0.0.1/first/3.txt
3
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/second/3.txt
3
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/third/3.txt
third

如果不要 last ,不要 break會(huì)怎么樣呢,他們的作用就是中止下面的return等指令運(yùn)行
而last是rewrite后的url還可以再作rewrite,break就直接rewrite,不再做新的rewrite了

curl -H"Host:rewrite.example.wjx" http://127.0.0.1/first/3.txt
first
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/second/3.txt
second
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/third/3.txt
third

最后就是 permanent 和 redirect了。其實(shí)這兩就是301 和 302 ,且如果 replacement 中有協(xié)議的話,默認(rèn)就是 302
如下配置

        location /redirect1 {
                rewrite /redirect1(.*) $1 permanent;
        }
        location /redirect2 {
                rewrite /redirect2(.*) $1 redirect;
        }
        location /redirect3 {
                rewrite /redirect3(.*) http://rewrite.example.wjx$1;
        }
        location /redirect4 {
                rewrite /redirect4(.*) http://rewrite.example.wjx$1 permanent;
        }

訪問后如下,第一個(gè)會(huì)返回301,第二,三個(gè)會(huì)返回302,第四個(gè)返回301。

if 指令

if 指令也是rewrite模塊中的一個(gè)指令。
其可作用于 server 和 location 塊中。
一般可使用 字符串與變量做匹配 '=' 和 '!=' 。
也可以正則匹配 '~' 或 '~!'。
檢測文件是否存在'-f' 或 '!-f' ,目錄則是 '-d'。
檢查文件,目錄,軟鏈接是否存在' -e' 或者 '!-e'。
檢查是否為可執(zhí)行文件,使用'-x' 或者 '!-x'。
以下為示例。

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+(?:;|$))") {
    set $id $1;
}
if ($request_method = POST) {
    return 405;
}
if ($slow) {
    limit_rate 10k;
}
if ($invalid_referer) {
    return 403;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容