天天看點

Nginx基礎知識之rewrite反向代理規則

作者:王嘯皓月山巅

location ~ .*\.(sh|bash)?$ {

return 403;

}

~是區分大小寫的比對。

? 是比對前面的字元零次或者一次。

狀态碼403是Fobidden,表示伺服器已經了解請求,但是拒絕執行它。

通路的URL以.sh或.bash結尾,則傳回狀态碼403。

403表示伺服器已經了解請求,但是拒絕執行它。

---我是華麗的分隔線---

rewrite指令的文法是:

rewrite regex replacement flag

關鍵字 正規表達式 替換部分 标記

if ($host ~* www\.(.*) {

set $host_without_www $1;

rewrite ^(.*)$ http://$host_without_www$1 permanent;

}

這裡把server_name的主機名,去掉www的後面部分,指派給了變量$host_without_www。

重寫表達式隻對相對路徑有效,配對主機名,應該使用if語句。

permanent是傳回301永久重定向。

這裡的$1是/foo,而不是www.mydomain.com/foo。

---我是華麗的分隔線---

rewrite指令的最後一項參數是flag标記,支援的标記有:

last:相當于apache裡面的[L],表示完成rewrite。

break:本條規則比對完成後,終止比對,不再比對後面的規則。

redirect:傳回302臨時重定向。

permanent:傳回301永久重定向。

其中last和break用來實作URL重寫,浏覽器位址欄的URL位址不變;redirect和permanent浏覽器的位址欄會顯示跳轉之後的URL位址。

一般使用alias指令時,必須要用last指令;使用proxy_pass指令時要用break标記。last标記在本條規則執行完畢後,會對其所在的server {…}标簽重新發起請求,而break标記則在本條規則比對完畢後,終止比對,不再比對後面的規則。

一般在根location中,即location/{……}或者直接在server标簽中編寫rewrite規則,使用last标記,在非根location中,則使用break标記。

---我是華麗的分隔線---

/photos/123456重定向到:

/path/to/photos/12/1234/123456.png 可以使用大括号進行分割代碼塊。

可以用下面的方法:

rewrite "/photos/([0-9]{2})([0-9]{2})([0-9]{2})"

/path/to/photos/$1/$1$2/$1$2$3.png;

[0-9]比對數字

{n}表示重複幾次。

nginx rewrite指令的寫法是:

rewrite regex replacement flag

-----我是華麗的分隔線----

*比對前面的表達式零次或者多次

+比對前面的表達式一次或者多次

?比對前面的子表達式零次或者一次

---我是華麗的分隔線----

set variable value

set指令用來定義一個變量,并且給變量指派。

多目錄轉換成參數abc.domain.com/sort/2 => abc.domain.com/index.php?act=sort&name=abc&id=2:

if ($host ~* (.*)\.domain\.com) {

set $sub_name $1;

rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

}

這裡~*不區分大小寫比對。

sub_name變量設定的值是域名的字首abc。

\/反斜杠\用來轉義斜杠。

\d比對一個數字字元,等價于[0-9]

+比對前面的字元一次或者多次

?比對前面的字元零次或者一次。

\/?比對URL末尾有/或者沒有/。

rewrite表達式中,把(\d+)指派給了id,其實就是id=2。

---我是華麗的分隔線---

目錄對換:

/123456/xxxx->/xxxx?id=123456:

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

這裡\d比對1個數字字元,等價于[0-9]。

+比對前面的字元一次或者多次。

.點比對任意一個單字元,+比對前面的字元一次或者多次。

一般在根location中,即location/{……}或者直接在server标簽中編寫rewrite規則,使用last标記,在非根location中,則使用break标記。

---我是華麗的分隔線---

如果apache的rewrite規則改成nginx的rewrite規則後,使用nginx -t 指令檢查發現nginx.conf配置檔案有文法錯誤,那麼主要是大括号引起的,那麼可以嘗試給條件加上引号。

---我是華麗的分隔符----

①:Apache的RewriteCond指令對應Nginx的if指令;

②:Apache的RewriteRule指令對應Nginx的rewrite指令;

③:Apache的[R]标記對應nginx 的redirect标記;

④:Apache的[P]标記對應Nginx的last标記;

⑤:Apache的[R,L]标記對應Nginx的redirect标記;

⑥:Apache的[P,L]标記對應Nginx的last标記。

⑦:Apache的[PT,L]标記對應Nginx的last标記。

Nginx基礎知識之rewrite反向代理規則

鼓勵的話語:強者從不抱怨環境!