Nginx Rewrite規(guī)則相關指令
Nginx Rewrite規(guī)則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。一個簡單的Nginx Rewrite規(guī)則語法如下:
rewrite ^/b/(.*)\.html /play.PHP?video=$1 break;
如果加上if語句,示例如下:
if (!-f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
Nginx與Apache的Rewrite規(guī)則實例對比
簡單的Nginx和Apache 重寫規(guī)則區(qū)別不大,基本上能夠完全兼容。例如:
Apache Rewrite 規(guī)則:
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 規(guī)則:
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規(guī)則改為Nginx的Rewrite規(guī)則,其實很簡單:Apache的RewriteRule指令換成Nginx的rewrite指令,Apache的[L]標記換成Nginx的last標記,中間的內容不變。
如果Apache的Rewrite規(guī)則改為Nginx的Rewrite規(guī)則后,使用nginx -t命令檢查發(fā)現(xiàn)nginx.conf配置文件有語法錯誤,那么可以嘗試給條件加上引號。例如一下的Nginx Rewrite規(guī)則會報語法錯誤:
rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;
加上引號就正確了:
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;
Apache與Nginx的Rewrite規(guī)則在URL跳轉時有細微的區(qū)別:
Apache Rewrite 規(guī)則:
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]
Nginx Rewrite 規(guī)則:
rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent;
以上示例中,我們注意到,Nginx Rewrite 規(guī)則的置換串中增加了“http://$host”,這是在Nginx中要求的。
另外,Apache與Nginx的Rewrite規(guī)則在變量名稱方面也有區(qū)別,例如:
Apache Rewrite 規(guī)則:
RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L]
Nginx Rewrite 規(guī)則:
rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host last;
Apache與Nginx Rewrite 規(guī)則的一些功能相同或類似的指令、標記對應關系:
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 規(guī)則:
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配置寫法來實現(xiàn)這個示例:
Nginx Rewrite 規(guī)則:
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;
}
rewrite 的語法
語法: rewrite regex replacement flag
默認: none
作用域: server, location, if
This directive changes URI in accordance with the regular and the replacement string. Directives are carried out in order of appearance in the configuration file.
這個指令根據表達式來更改URI,或者修改字符串。指令根據配置文件中的順序來執(zhí)行。
Be aware that the rewrite regex only matches the relative path instead of the absolute URL. If you want to match the hostname, you should use an if condition, like so:
注意重寫表達式只對相對路徑有效。如果你想配對主機名,你應該使用if語句。
rewrite只是會改寫路徑部分的東東,不會改動用戶的輸入參數,因此這里的if規(guī)則里面,你無需關心用戶在瀏覽器里輸入的參數,rewrite后會自動添加的,因此,我們只是加上了一個?號和后面我們想要的一個小小的參數 ***https=1就可以了。
nginx的rewrite規(guī)則參考:
結合QeePHP的例子
多目錄轉成參數
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
目錄對換
/123456/xxxx -> /xxxx?id=123456
例如下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:
目錄自動加“/”
禁止htaccess
禁止多個目錄
禁止以/data開頭的文件
可以禁止/data/下多級目錄下.log.txt等請求;
禁止單個目錄
不能禁止.log.txt能請求
禁止單個文件
給favicon.ico和robots.txt設置過期時間;
這里為favicon.ico為99天,robots.txt為7天并不記錄404錯誤日志
設定某個文件的過期時間;這里為600秒,并不記錄訪問日志
文件反盜鏈并設置過期時間
這里的return 412 為自定義的http狀態(tài)碼,默認為403,方便找出正確的盜鏈的請求
“rewrite ^/ http://leech.divmy.com/leech.gif;”顯示一張防盜鏈圖片
“access_log off;”不記錄訪問日志,減輕壓力
“expires 3d”所有文件3天的瀏覽器緩存
只充許固定ip訪問網站,并加上密碼
將多級目錄下的文件轉成一個文件,增強seo效果
/job-123-456-789.html 指向/job/123/456/789.html
將根目錄下某個文件夾指向2級目錄
如/shanghaijob/ 指向 /area/shanghai/
如果你將last改成permanent,那么瀏覽器地址欄顯是/location/shanghai/
上面例子有個問題是訪問/shanghai 時將不會匹配
這樣/shanghai 也可以訪問了,但頁面中的相對鏈接無法使用,
如./list_1.html真實地址是/area/shanghia/list_1.html會變成/list_1.html,導至無法訪問。
那我加上自動跳轉也是不行咯
(-d $request_filename)它有個條件是必需為真實目錄,而我的rewrite不是的,所以沒有效果
知道原因后就好辦了,讓我手動跳轉吧
文件和目錄不存在的時候重定向:
域名跳轉
多域名轉向
三級域名跳轉
域名鏡向
某個子目錄作鏡向
discuz ucenter home (uchome) rewrite
discuz 7 rewrite
給discuz某版塊單獨配置域名
discuz ucenter 頭像 rewrite 優(yōu)化
jspace rewrite
另外這里還有一個工具可以直接把apache規(guī)則轉化為nginx規(guī)則
http://www.anilcetin.com/convert-apache-htaccess-to-nginx/
參考:
http://wiki.nginx.org/NginxChsHttpRewriteModule
http://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspx