rewrite重寫基礎實列

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 { 
    deny all; 


禁止單個文件 

location ~ /data/sql/data.sql { 
    deny all; 


favicon.ico和robots.txt設置過時時間; 這裏爲favicon.ico爲99天,robots.txt爲7天並不記錄404錯誤日誌 

location ~(favicon.ico) { 
    log_not_found off; 
    expires 99d; 
    break; 


location ~(robots.txt) { 
    log_not_found off; 
    expires 7d; 
    break; 


設定某個文件的瀏覽器緩存過時時間;這裏爲600秒,並不記錄訪問日誌 

location ^~ /html/scripts/loadhead_1.js { 
    access_log off; 
    expires 600; 
    break; 


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; 
    } 
    access_log off; 
    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
    deny all; 
    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
    access_log off; 


多域名轉向 

 
server { 
    listen 80; 

    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; 
    break; 


域名鏡向 

server { 
    listen 80; 
    server_name mirror.jjonline.cn; 
    index index.html index.htm index.php; 
    root /var/www/public_html; 
    rewrite ^/(.*) http://www.jjonline.cn/$1 last; 
    access_log off; 


某個子目錄做鏡向,這裏的示例是demo子目錄

location ^~ /demo { 
    rewrite ^.+ http://demo.jjonline.cn/ last; 
    break; 
}

如下在附帶本博客的rewrite寫法,emlog系統的rewrite
location ~ {
    if (!-e $request_filename) {
           rewrite ^/(.+)$ /index.php last;
    }
}php

相關文章
相關標籤/搜索