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标記。
鼓勵的話語:強者從不抱怨環境!