站長資訊網
        最全最豐富的資訊網站

        Nginx Location和Rewrite深入剖析

        Nginx Location

        Nginx由內核和模塊組成,其中內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端的請求映射到一個location block,而location是Nginx配置中的一個指令,用于訪問的URL匹配,而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應的工作。

        • location功能是由ngx_http_index_module模塊提供的。
        • location常放在server上下文。
        • location匹配與location的放置順序無關,而是與location匹配規則的優先級有關。

        常見的location匹配的URL方式如下:

        符號 解釋
        = 字面精確匹配,精確到文件
        ^~ URL的前綴匹配,不支持正則
        ~ 正則匹配檢查,區分大小寫
        ~* 正則匹配檢查,不區分大小寫
        / 不帶任何前綴

        location匹配優先級如下:

        (location =) > (location 完整路徑)> (location ^~) > (location ~) > (location ~*) > ( location部分起始路徑) > (location / )

        Nginx Location規則案例:

        1.只會匹配/,優先級比location / 低,= file 匹配到file的優先級最高。

        location =/ {  [ configuration L1  ]  }

        2.直接匹配到到file,優先級最高。

        location =/index.html {  [ configuration L2  ]  }

        3.可以匹配任何請求,但是因為從 / 開始匹配,所有優先級最低。

        location / {  [ configuration L3  ]  }

        4.匹配任何以/p_w_picpaths/開始的請求,并且停止匹配其他的loation;

        location = /p_w_picpaths/ {  [ configuration L4 ]  }

        5.匹配以html、txt、gif、jpg、jpeg結尾的URL文件請求, 但是所有/p_w_picpaths/目錄的請求將由 [Configuration L4]處理。

        location ~* .(html|txt|gif|jpg|jpeg)$ {    [ configuration L5]  }

        瀏覽器發起HTTP Request URI案例與Location規則案例匹配如下:

        / -> 匹配configuration L3; /index.html 匹配configuration L2;  /p_w_picpaths/ 匹配configuration L4; /p_w_picpaths/logo.png 匹配configuration L4; /img/test.jpg 匹配configuration L5。

        生產環境中無需在Nginx.conf配置文件中同時添加五種規則匹配,如下為企業生產環境Nginx Location部分配置代碼:

        #匹配/,優先級最低
        location /
        {
            root /var/www/html/;
         expires      60d;
        }
        #匹配靜態頁面,由本地解析
        location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
        {
         root /var/www/html/; 
         expires      60d;     
        }
        #匹配動態頁面,交給后端服務器
        location ~ .*.(jsp|php|cgi|do)$
        {
            root /var/www/html/;
            proxy_pass http://linux_web;
            proxy_http_version 1.1;
            proxy_set_header Connection “”;
            proxy_set_header Host  $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
        }
        #直接匹配newindex.html,優先級最高
        location =/newindex.html
        {
            root /var/www/newwww/;
         expires      60d;
        }

        Nginx Rewrite

        Rewirte規則也稱為規則重寫,主要功能是實現瀏覽器訪問HTTP URL的跳轉,其正則表達式是基于Perl語言。通常而言,幾乎所有的WEB服務器均可以支持URL重寫。

        Rewrite URL規則重寫的用途:

        • 對搜索引擎優化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取網站頁面;
        • 隱藏網站URL真實地址,瀏覽器顯示更加美觀;
        • 網站變更升級,可以基于Rewrite臨時重定向到其他頁面。
        • Nginx Rewrite是由ngx_http_rewrite_module模塊提供;
        • Nginx Rewrite可以使用正則替換URL,返回重定向頁面。
        • Nginx Rewrite是按順序進行匹配的。
        • Nginx Rewrite放在server,location,if上下文。

        Nginx Rewrite規則使用中有三個概念需要理解,分別是:Rewrite結尾標識符、Rewrite規則常用表達式、Nginx Rewrite變量,如下為三個概念的詳解:

        Rewrite結尾標識符:由于Rewrite規則末尾,表示規則的執行屬性。

        1.last :相當于Apache里的(L)標記,表示完成rewrite匹配,匹配完成后還會向下繼續匹配。

        2.break:本條規則匹配完成后,終止匹配,不再匹配后面的規則.

        3.redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址。

        4.permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址。

        其中last和break用來實現URL重寫時,瀏覽器地址欄URL地址不變。

        Rewrite規則常用表達式:要用于匹配參數、字符串及過濾設置。

        符號 意義
        . 匹配任何單個字符
        [word] 匹配字符串word
        [^word] 不匹配字符串word
        aa|bb 可選擇字符串aa|bb
        ? 匹配0到1個字符
        * 匹配0到多個字符
        + 匹配1到多個字符
        ^ 字符串開始標志
        $ 字符串結尾標志
        n 轉義字符

        Rewrite變量:常用于匹配HTTP請求頭信息、瀏覽器主機名、URL等。

        HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;
        connection & request: REMOTE_ADDR, QUERY_STRING;
        server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
        system stuff: TIME_YEAR, TIME_MON, TIME_DAY。

        詳解如下:
        HTTP_USER_AGENT  用戶使用的代理,例如瀏覽器;
        HTTP_REFERER 告知服務器,從哪個頁面來訪問的;
        HTTP_COOKIE            客戶端緩存,主要用于存儲用戶名和密碼等信息;
        HTTP_HOST 匹配服務器ServerName域名;
        HTTP_ACCEPT 客戶端的瀏覽器支持的MIME類型;
        REMOTE_ADDR 客戶端的IP地址
        QUERY_STRING URL中訪問的字符串;
        DOCUMENT_ROOT        服務器發布目錄;
        SERVER_PORT 服務器端口;
        SERVER_PROTOCOL 服務器端協議;
        TIME_YEAR 年;
        TIME_MON 月;
        TIME_DAY 日;

        補充: if指令:

        語法: if (condition) { … } 默認值: — 上下文: server, location

        計算指定condition的值。計算指定的condition的值。如果為真,執行定義在大括號中的rewrite模塊指令,并將if指令中的配置指定給請求。if指令會從上一層配置中繼承配置。

        condition為下:

        條件 解釋
        變量名 如何變量值為空或者以0開始的字符串,則為假
        = 運算符等于,則為真
        != 運算符不等于,則為真
        ~ 大小寫敏感,匹配變量和正則
        ~* 大小寫不敏感,匹配變量和正則
        -f | !-f 檢查文件是否存在
        -d | !-d 檢查目錄是否存在
        -e | !-e 檢查文件,目錄或符號鏈接是否存在
        -x | !-x 檢查是否是可執行文件

        Nginx Rewrite案例

        1.將www.abc1.com 跳轉到 www.abc2.com

        if ( $host = ‘www.abc1.com’ ){    rewrite ^/(.*)$ http://www.abc2.com/$1 permanent;  }

        2.訪問www.abc1.com跳轉www.abc1.com/newindex.html

        rewrite ^/$ http://www.abc1.com/newindex.html permanent;

        3.訪問/test/跳轉到www.abc1.com/newindex.html

        rewrite ^/test/$ http://www.abc1.com/newindex.html permanent;

        4.多域名跳轉到 www.abc1.com

        if ( $host != ‘www.abc1.com’ ) {  rewrite ^/(.*)$  http://www.abc1.com/$1  permanent;  }

        5.訪問文件和目錄不存在跳轉至index.html。

        if ( !-e $request_filename )  {  rewrite  ^/(.*)$  /index.html  last;  }

        6.目錄對換 /xxxx/123456 ====> /xxxx?id=123456

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

        7.判斷瀏覽器User Agent跳轉。

        if( $http_user_agent  ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; }

        8.禁止訪問以.sh,.flv,.mp3為文件后綴名的文件。

        location ~ .*.(sh|flv|mp3)$  {  return 403;  }

        9.將移動用戶訪問跳轉至移動端。

        if ( $http_user_agent ~* “(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)” )  {  rewrite ^/$      http://m.linuxidc.net/      permanent;  }

        10.匹配URL訪任意字符串后面含有?tid=13就跳轉,$args 表示任意字符串

        if ( $args ~* tid=13 ){  return 404; }

        11.訪問/10690/jj/123跳轉至/index.php?tid/10690/items=123,[0-9]表示任意一個數字,+表示多個,(.+)表示任何多個字符。

        rewrite  ^/([0-9]+)/jj/(.+)$    /index.php?tid/$1/items=$2    permanent;

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 免费精品无码AV片在线观看| 国产精品久久永久免费| 国语自产少妇精品视频蜜桃| 精品日韩欧美国产| 国产精品成人在线| 野狼第一精品社区| 国产伦精品一区二区免费| 99久久人妻无码精品系列蜜桃| 日韩美女18网站久久精品| 99久re热视频这里只有精品6| 嫩草伊人久久精品少妇AV| 亚洲精品麻豆av| 国内精品国语自产拍在线观看| 精品视频第一页| 99re6这里有精品热视频| 无码精品久久久久久人妻中字| 国产偷亚洲偷欧美偷精品 | 国产乱人伦精品一区二区在线观看| 国精品无码一区二区三区左线 | 国产精品久久久99| 久久精品成人国产午夜| 91视频精品全国免费观看| 日产精品久久久一区二区| 亚洲精品无码成人片在线观看| 国产系列高清精品第一页| 91精品国产91久久久久久青草 | 精品深夜AV无码一区二区| 欧美精品VIDEOSSEX少妇| 夜夜爽一区二区三区精品| 热久久国产欧美一区二区精品| 精品欧美激情在线看| 国产综合色产在线精品| 国产精品免费看久久久香蕉| 国产成人精品综合在线观看| 99精品在线免费| 99riav国产精品| 国产精品玖玖美女张开腿让男人桶爽免费看 | 国产精品特级毛片一区二区三区| 亚洲综合国产精品第一页| 亚洲乱码日产精品a级毛片久久| 欧美精品福利视频一区二区三区久久久精品|