站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        Nginx Location和Rewrite深入剖析

        Nginx Location

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

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

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

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

        location匹配優(yōu)先級如下:

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

        Nginx Location規(guī)則案例:

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

        location =/ {  [ configuration L1  ]  }

        2.直接匹配到到file,優(yōu)先級最高。

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

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

        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]  }

        瀏覽器發(fā)起HTTP Request URI案例與Location規(guī)則案例匹配如下:

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

        生產(chǎn)環(huán)境中無需在Nginx.conf配置文件中同時添加五種規(guī)則匹配,如下為企業(yè)生產(chǎn)環(huán)境Nginx Location部分配置代碼:

        #匹配/,優(yōu)先級最低
        location /
        {
            root /var/www/html/;
         expires      60d;
        }
        #匹配靜態(tài)頁面,由本地解析
        location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
        {
         root /var/www/html/; 
         expires      60d;     
        }
        #匹配動態(tài)頁面,交給后端服務器
        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,優(yōu)先級最高
        location =/newindex.html
        {
            root /var/www/newwww/;
         expires      60d;
        }

        Nginx Rewrite

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

        Rewrite URL規(guī)則重寫的用途:

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

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

        Rewrite結尾標識符:由于Rewrite規(guī)則末尾,表示規(guī)則的執(zhí)行屬性。

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

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

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

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

        其中l(wèi)ast和break用來實現(xiàn)URL重寫時,瀏覽器地址欄URL地址不變。

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

        符號 意義
        . 匹配任何單個字符
        [word] 匹配字符串word
        [^word] 不匹配字符串word
        aa|bb 可選擇字符串a(chǎn)a|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        服務器發(fā)布目錄;
        SERVER_PORT 服務器端口;
        SERVER_PROTOCOL 服務器端協(xié)議;
        TIME_YEAR 年;
        TIME_MON 月;
        TIME_DAY 日;

        補充: if指令:

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

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

        condition為下:

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

        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]表示任意一個數(shù)字,+表示多個,(.+)表示任何多個字符。

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

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产精品国产三级国产潘金莲| 成人精品一区二区久久| 影视网欧洲精品| 亚洲精品乱码久久久久久中文字幕| 91精品国产高清久久久久久国产嫩草| 日韩精品一区二区亚洲AV观看| 国产在线精品一区二区不卡麻豆| 国产精品扒开腿做爽爽爽视频| 亚洲精品国精品久久99热| 久久精品免费观看| 精品久久久久久无码中文字幕一区 | 2021国产精品视频网站| 国产成人vr精品a视频| 亚洲精品美女久久777777| 亚洲精品第一国产综合精品99| 精品中文高清欧美| 精品精品国产高清a毛片| 99久久精品免费看国产一区二区三区 | 国产精品女同一区二区| 人妻少妇精品中文字幕AV| 亚洲精品无码mv在线观看网站| 日韩精品一区二区三区视频| 久久精品国产一区二区电影| 久久久精品人妻无码专区不卡| 国产在AJ精品| 狠狠色伊人久久精品综合网| 精品福利一区二区三区精品国产第一国产综合精品 | 日韩一区二区精品观看| 日韩福利视频精品专区| 欧美精品丝袜久久久中文字幕| 久久久久人妻精品一区三寸蜜桃| 国模精品一区二区三区| 久久996热精品xxxx| 久久久99精品一区二区| 久久久99精品成人片中文字幕| 麻豆精品三级全部视频| 亚洲国产主播精品极品网红 | 在线观看91精品国产入口| 国内精品久久九九国产精品| 久久国产乱子伦精品免费强| 国产精品久久久天天影视|