Nginx Rewrite域名及資源重定向


一.正則匹配

    1.匹配規則

        ^$  標識符匹配后面跟-一個字符串。匹配字符串后將停止對后續的正則表達式進行匹配,如location ^~/images/,在匹配了/images/這個字符串后就停止對后續的正則匹配

        =   精准匹配,如location=/,只會匹配url為/的請求

        ~   區分大小寫的匹配

        ~*  不區分大小寫的匹配

        !~  對區分大小寫的匹配取非

        !~* 對不區分大小寫的匹配取非

        /   通用匹配,如果沒有其它匹配,任何請求都會被匹配到

    2.正則表達

        *   重復前面的字符0次或多次

        ?   重復前面的字符0次或1次

        +   重復前面的字符1次或多次

        .   匹配除換行符以外的任意1個字符

        (a|b)   匹配a或b

        ^       以...開頭

        $       以...結尾

        {n}     重復前面的字符n次

        {n,}    重復前面的字符n次或更多次

        {n,m)   重復前面的字符n到m次

        *?      重復前面的字符0次或多次,但盡可能少重復

        +?      重復前面的字符1次或更多次,但盡可能少重復

        ??      重復前面的字符0次或1次,但盡可能少重復

        {n.m}?  重復前面的字符n到m次, 但盡可能少重復

        {n,}?   重復前面的字符n次以上,但盡可能少重復

   

    3.正則表達式補充

        \W 匹配任意不是字母,數字,下划線.漢字的字符

        \S 配置任意不是空白符的字符

        \D 匹配任意非數字的字符

        \B 匹配不是單詞開頭或結束的位置

        [a] 匹配的那個字符a

        [a-z] 匹配a-z小寫字母任意一個

        [^a] 匹配除了a以外的任意字符

        [^abc] 匹配除了abc這幾個字母以外的任意字符

nginx Rewrite 規則

rewrite 功能就是,使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標志位實現URL重寫及重定向,rewrite只能放在server{}里,location{} .if {} . 並且只能對域名后邊的除去參數外的字符竄起作用

nginx 的rewrite 規則兼容正則表達式的語法進行規則匹配,如果需要Nginx 的rewrite 功能,在編譯安裝nginx之前,必須安裝PCRE庫

語法:

rewrite 正則表達式  更換目標  [標志位]

rewrite和location 功能有點像,都能實現跳轉,主要區別在於rewrite 是在同一域名內更改獲取資源的路徑,而Location 是對路徑做控制訪問或反向代理,可以使用proxy_pass到其他機器,極多情況下rewrite 也會寫在Location里,他們的執行順訊是

1. 執行server塊的rewrite指令

2. 執行Location匹配

3. 執行選定的Location中的rewrite指令

(如果某段被重寫,則重新循環1-3,直到找到真實存在的文件,循環經過10次,就會返回500錯誤)

flag標志位

last 相當於Apache 的[L]標記,表示完成rewrite

break 終止匹配,匹配完成時,不在匹配后的規則

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

permanert 返回301 永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址

last 一般寫在server和if 中,而break 一般使用在location 中

last 不終止重寫后的URL匹配,即新的URL會在從server走一遍匹配流程,而Break終止重寫后的匹配

break 和last 都能組織繼續執行后面的rewrite 命令

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

redirect 和 permanent 用來實現URL跳轉,瀏覽器地址欄會顯示跳轉后的URL地址

  if 指令與全局變量

        if 判斷指令

            語法為 if (condirion) {...},對給定的條件condition進行判斷.如果為真,大括號內的rewrite指令將被執行,if條件(condition)可以是如下任何內容

 

            直接比較變量和內容是,使用=或!=

            -f 和 !-f   用來判斷是否存在文件

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

            -e 和 !-e   用來判斷是否存在文件或目錄

            -x 和 !-x   用來判斷文件是否可執行

  例如:

                if ($http_user_agent ~ MSIE)

                    rewriet ^(.*)$ /msie/$1 break;

                }                               //如果UA包含"MSIE",rewrite請求到/msid/目錄下

 

                if ($request_method = POST ) {

                    return 405

                }       //如果提交方法為POST,則返回狀態碼405(Method not allowed) retum不能返回301,302(因為返回301,302不能只返回狀態嗎,還必選有重定向的URL,所以return指令無法返回301,302)

                

                if ($slow) {

                    limit_rate 10k

                }       //限速,$slow可通過set指令設置

 

                if (!-f $request_filename) {

                    break;

                    proxy_pass http://127.0.0.1;

                }       //如果請求的文件名不存在,則方向代理到localhost.這里的break也是停止rewrite檢查

 

                if ($args ~ post=140) {

                    rewrite ^ http://example.com/ permanent;

                }       //如果query stiong中包含"post=140",永久重定向到exampl.com

 nginx變量

        $arg_PARAMETER 這個變量值為:GET請求中變量名PARAMETER參數的值。

        $args 這個變量等於GET請求中的參數。例如,foo=123&bar=blahblah;這個變量只可以被修改

        $binary_remote_addr 二進制碼形式的客戶端地址。

        $body_bytes_sent 傳送頁面的字節數

        $content_length 請求頭中的Content-length字段。

        $content_type 請求頭中的Content-Type字段。

        $cookie_COOKIE cookie COOKIE的值。

        $document_root 當前請求在root指令中指定的值。

        $document_uri 與$uri相同。

        $host 請求中的主機頭(Host)字段,如果請求中的主機頭不可用或者空,則為處理請求的server名稱(處理請求的server的server_name指令的值)。值為小寫,不包含端口。

        $hostname  機器名使用 gethostname系統調用的值

        $http_HEADER   HTTP請求頭中的內容,HEADER為HTTP請求中的內容轉為小寫,-變為_(破折號變為下划線),例如:$http_user_agent(Uaer-Agent的值), $http_referer...;

        $sent_http_HEADER  HTTP響應頭中的內容,HEADER為HTTP響應中的內容轉為小寫,-變為_(破折號變為下划線),例如: $sent_http_cache_control, $sent_http_content_type...;

        $is_args 如果$args設置,值為"?",否則為""。

        $limit_rate 這個變量可以限制連接速率。

        $nginx_version 當前運行的nginx版本號。

        $query_string 與$args相同。

        $remote_addr 客戶端的IP地址。

        $remote_port 客戶端的端口。

        $remote_user 已經經過Auth Basic Module驗證的用戶名。

        $request_filename 當前連接請求的文件路徑,由root或alias指令與URI請求生成。

        $request_body 這個變量(0.7.58+)包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義。

        $request_body_file 客戶端請求主體信息的臨時文件名。

        $request_completion 如果請求成功,設為"OK";如果請求未完成或者不是一系列請求中最后一部分則設為空。

        $request_method 這個變量是客戶端請求的動作,通常為GET或POST。

        包括0.8.20及之前的版本中,這個變量總為main request中的動作,如果當前請求是一個子請求,並不使用這個當前請求的動作。

        $request_uri 這個變量等於包含一些客戶端請求參數的原始URI,它無法修改,請查看$uri更改或重寫URI。

        $scheme 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;

        $server_addr 服務器地址,在完成一次系統調用后可以確定這個值,如果要繞開系統調用,則必須在listen中指定地址並且使用bind參數。

        $server_name 服務器名稱。

        $server_port 請求到達服務器的端口號。

        $server_protocol 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。

   .nginx location應用規則

    示例:   location [=|~|~*|!~|~!~*] /usl/ {...}

            默認值: no

            使用字段: server

            location參數根據URL的不同需求進行配置,可以使用字符串與正則表達式匹配

 

                                        location = / {

                                            proxy_pass http://tomcat_server;

                                        }

                               

            location = / {

            #精確匹配/  主機名后面不能帶任意字符

            [configuration A]

            }  

 

            location / {

            #因為所有地址都以/開頭,所以這條規則將匹配到所有請求,但是正則和最長字符串會優先匹配

            [configuration B]

            }

 

            location /documents/ {

            #匹配任何以/documets/開頭的地址,匹配符合以后,還要繼續向下搜索

            #只有后面的正則表達式沒有匹配到時,這一條才會采用   

            [configuration C]

            }

           

            location ~ /documents/Abc {

            #匹配/documents/Abc的完整路基,匹配符合以后,還要繼續向下匹配

            #只有后面的正則表達式(精確匹配)沒有匹配到時,這一條才會采用

            [configuration CC]

            }

 

            location ^~ /images/ {

            #匹配任意以/images/開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條

            [configuration D]

            }

 

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

            #匹配所有以gif,jpg,jpeg結尾的請求

            #然而,所有請求/images/下的圖品會被config D處理,因為^~到達不了這一條

            [configuration E]

            }

 

            location /images/ {

            #字符匹配到/images/,繼續往下,發現^~存在

            [configuration F]

            }

           

            location /images/abc {

            #最長字符匹配到/images/abc,繼續往下,會發行^~存在

            #F與G的放置順序是沒有關系的

            }

 

            location ~ /images/abc/ {

            #只有去掉config D才有效:先最長匹配config G 開頭的地址,繼續往下搜索,匹配到這一條采用

            }

           

 

 

    匹配優先級

        (location =  精確匹配 ) > (location 完整路徑 ) > (location ^~ 路徑 ) > (location ~,~*正則順序) > (location 部分起始路徑 ) > (location / 通用匹配)

 

 URL分析

        http://localhost:88/test1/test2/test.php

       

        $host:localhost

        $server_port:88

        $request_uri :  http://localhost:88/test1/test2/test.php

        $documenturl : /test1/test2/test.php

        $document_root : /var/www/html

        $request_filename : /var/www/html/test1/test2/test.php

 

實現域名跳轉

    server {

    listen 80

    server_name www.jd.com

    charset utf-8

    root html ;

    index   index.html index.htm;

    if ($host = "www.360buy.com") {

        rewrite ^(.*)$ http:/www.jd.com/$1 permanent;

    }

    }           //永久重定向到www.jd.com

 

                //也可以在location {} // if () 中使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM