nginx的rewrite重寫規則與apache對比
nginx rewrite規則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。一個簡單的nginx rewrite規則文法如下:
rewrite ^/b/(.*).html /play.php教程?video=$1 break;
如果加上if語句,樣本如下:
if (!-f $request_filename)
{
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
}
nginx與apache的rewrite規則執行個體對比
簡單的nginx和apache 重寫規則區別不大,基本上能夠完全相容。例如:
apache rewrite 規則:
rewriterule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [l]
rewriterule ^/ceshi/$ /zl/ceshi.php [l]
rewriterule ^/(mianshi)_([a-za-z]+)/$ /zl/index.php?name=$1_$2 [l]
rewriterule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [l]
nginx rewrite 規則:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
rewrite ^/ceshi/$ /zl/ceshi.php last;
rewrite ^/(mianshi)_([a-za-z]+)/$ /zl/index.php?name=$1_$2 last;
rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;
由以上樣本可以看出,apache的rewrite規則改為nginx的rewrite規則,其實很簡單:apache的rewriterule指令換成nginx的rewrite指令,apache的[l]標記換成nginx的last標記,中間的內容不變。
如果apache的rewrite規則改為nginx的rewrite規則後,使用nginx -t命令檢查發現nginx.conf設定檔有語法錯誤,那麼可以嘗試給條件加上引號。例如一下的nginx rewrite規則會報語法錯誤:
rewrite ^/([0-9]{5}).html$ /x.jsp教程?id=$1 last;
加上引號就正確了:
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;
apache與nginx的rewrite規則在url跳轉時有細微的區別:
apache rewrite 規則:
rewriterule ^/html/tagindex/([a-za-z]+)/.*$ /$1/ [r=301,l]
nginx rewrite 規則:
rewrite ^/html/tagindex/([a-za-z]+)/.*$ http://$host/$1/ permanent;
以上樣本中,我們注意到,nginx rewrite 規則的置換串中增加了“http://$host”,這是在nginx中要求的。
另外,apache與nginx的rewrite規則在變數名稱方面也有區別,例如:
apache rewrite 規則:
rewriterule ^/user/login/$ /user/login.php?login=1&forward=http://%{http_host} [l]
nginx rewrite 規則:
rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host last;
apache與nginx rewrite 規則的一些功能相同或類似的指令、標記對應關係:
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標記;
允許指定的網域名稱訪問本站,其他網域名稱一律跳轉到http://www.aaa.com
apache rewrite 規則:
rewritecond %{http_host} ^(.*?).domain.com$
rewritecond %{http_host} !^qita.domain.com$
rewritecond %{document_root}/market/%1/index.htm -f
rewriterule ^/wu/$ /market/%1/index.htm [l]
nginx的if指令不支援嵌套,也不支援and、or等多條件匹配,相比於apache的rewritecond,顯得麻煩一些,但是,我們可以通過下一頁的nginx配置寫法來實現這個樣本:
nginx rewrite 規則:
if ($host ~* ^(.*?).domain.com$)
{
set $var_wupin_city $1;
set $var_wupin ‘1′;
}
if ($host ~* ^qita.domain.com$)
{
set $var_wupin ‘0′;
}
if (!-f $document_root/market/$var_wupin_city/index.htm)
{
set $var_wupin ‘0′;
}
if ($var_wupin ~ ‘1′)
{
rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
}