天天看點

nginx 重寫 rewrite 基礎及執行個體(轉)

nginx rewrite 正規表達式比對

大小寫比對

~ 為區分大小寫比對 

~* 為不區分大小寫比對 

!~和!~*分别為區分大小寫不比對及不區分大小寫不比對 

檔案及目錄比對

-f和!-f用來判斷是否存在檔案 

-d和!-d用來判斷是否存在目錄 

-e和!-e用來判斷是否存在檔案或目錄 

-x和!-x用來判斷檔案是否可執行 

flag标記

last 相當于Apache裡的[L]标記,表示完成rewrite

break 終止比對, 不再比對後面的規則。

redirect 傳回302臨時重定向 位址欄會顯示跳轉後的位址。

permanent 傳回301永久重定向 位址欄會顯示跳轉後的位址。

logcation的幾個使用執行個體:

   1)location  / { }:比對任何查詢,因為所有請求都以 / 開頭。但是正規表達式規則将被優先和查詢比對。

   2)location =/ {}:僅僅比對/

   3)location ~* \.(gif|jpg|jpeg)$

     {

        rewrite \.(gif|jpg)$ /logo.png;

     }:location不區分大小寫,比對任何以gif,jpg,jpeg結尾的檔案。

幾個執行個體:

多目錄轉成參數 

要求:abc.domian.com/sort/2 => abc.domian.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; 

目錄對換 

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

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

再來一個針對浏覽器優化的自動rewrite,這裡rewrite後的目錄可以是存在的;

例如設定nginx在使用者使用ie的使用重定向到/nginx-ie目錄

規則如下:

 if ($http_user_agent ~ MSIE) {

     rewrite ^(.*)$ /nginx-ie/$1 break; 

目錄自動加“/” ,這個功能一般浏覽器自動完成

if (-d $request_filename){ 

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 

以下這些可能就跟廣義的rewrite重寫無關了

禁止htaccess 

location ~/\.ht { 

    deny all; 

禁止多個目錄 

location ~ ^/(cron|templates)/ { 

    deny all; break; 

禁止以/data開頭的檔案,可以禁止/data/下多級目錄下.log.txt等請求

location ~ ^/data { 

禁止單個檔案 

location ~ /data/sql/data.sql { 

給favicon.ico和robots.txt設定過期時間; 這裡為favicon.ico為99天,robots.txt為7天并不記錄404錯誤日志 

location ~(favicon.ico) { 

    log_not_found off; 

    expires 99d; 

    break; 

location ~(robots.txt) { 

    expires 7d; 

設定某個檔案的浏覽器緩存過期時間;這裡為600秒,并不記錄通路日志 

location ^~ /html/scripts/loadhead_1.js { 

    access_log off; 

    expires 600; 

Nginx還可以自定義某一類型的檔案的保存期限時間,具體寫法看下文的代碼:

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {

if (-f $request_filename) {

   expires    1h;

   break;

  }

//上段代碼就将js|css|jpg|jpeg|gif|png|swf這類檔案的保存期限設定為一小時。

防盜鍊的設定:

防盜鍊:如果你的網站是個下載下傳網站,下載下傳步驟應該是先經過你的首頁找到下載下傳位址,才能下載下傳,為了防止某些網友直接通路下載下傳位址完全不通過首頁下載下傳,我們就可以使用防盜鍊的方式,具體代碼如下:

location ~* \.(gif|jpg|swf)$ {

  valid_referers none blocked start.igrow.cn sta.igrow.cn;

  if ($invalid_referer) {

  rewrite ^/ http://$host/logo.png;

}

檔案反盜鍊并設定過期時間--<盜鍊多次請求也會打開你的站點的圖檔啊,是以設定下緩存時間,不會每次盜鍊都請求并下載下傳這張圖檔>

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 

    valid_referers none blocked *.jjonline.cn *.jjonline.com.cn *.lanwei.org *.jjonline.org localhost  42.121.107.189; 

    if ($invalid_referer) { 

        rewrite ^/ http://img.jjonline.cn/forbid.gif; 

        return 417; 

        break; 

    } 

說明:

這裡的return 417 為自定義的http狀态碼,預設為403,友善通過nginx的log檔案找出正确的盜鍊的請求位址 

“rewrite ^/ http://img.jjonline.cn/forbid.gif;”顯示一張防盜鍊圖檔

 “access_log off;”不記錄通路日志,減輕壓力 

“expires 3d”所有檔案3天的浏覽器緩存 

隻充許固定ip通路網站,并加上密碼;這個對有權限認證的應用比較在行

location \ { 

    allow 22.27.164.25; #允許的ipd

    auth_basic “KEY”; #認證的一些設定

    auth_basic_user_file htpasswd; 

說明:location的應用也有各種變化,這裡的寫法就針對了根目錄了。

檔案和目錄不存在的時重定向

if (!-e $request_filename) { 

    #proxy_pass http://127.0.0.1; #這裡是跳轉到代理ip,這個代理ip上有一個監聽的web伺服器

    rewrite ^/ http://www.jjonline.cn/none.html;  #跳轉到這個網頁去

    #return 404; #直接傳回404碼,然後會尋找root指定的404.html檔案

域名跳轉 

server { 

    listen 80; 

    server_name jump.jjonline.cn ;#需要跳轉的多級域名

    index index.html index.htm index.php; #入口索引檔案的名字

    root /var/www/public_html/; #這個站點的根目錄

    rewrite ^/ http://www.jjonline.cn/; 

    #rewrite到這個位址,功能表現:在浏覽器上輸入jump.jjonline.cn并回車,不會有任何提示直接變成www.jjonline.cn

多域名轉向 

    server_name www.jjonline.cn www.jjonline.org;

    index index.html index.htm index.php; 

    root /var/www/public_html/; 

    if ($host ~ “jjonline\.org”) { 

        rewrite ^(.*) http://www.jjonline.cn$1 permanent; 

三級域名跳轉 

if ($http_host ~* “^(.*)\.i\.jjonline\.cn$”) { 

    rewrite ^(.*) http://demo.jjonline.cn$1; 

域名鏡向 

    server_name mirror.jjonline.cn; 

    root /var/www/public_html; 

    rewrite ^/(.*) http://www.jjonline.cn/$1 last; 

某個子目錄作鏡向,這裡的示例是demo子目錄

location ^~ /demo { 

    rewrite ^.+ http://demo.jjonline.cn/ last; 

以下在附帶本部落格的rewrite寫法,emlog系統的rewrite

location ~ {

    if (!-e $request_filename) {

           rewrite ^/(.+)$ /index.php last;

    }

http://www.cnblogs.com/buffer/p/3204718.html

繼續閱讀