1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          詳解nginx的rewrite應用,Nginx高級之Rewrite規則

          來源:互聯網轉載 時間:2024-10-28 09:14:54

          Rewrite主要的功能是實現URL重寫,Nginx 的 Rewrite 規則采用 PCRE Perl 兼容正則表達式的語法進行規則匹配,如相使用 Nginx 的 Rewrite 功能,在編譯 Nginx 前要編譯安裝 PCRE 庫。Rewrite主要實現url地址重寫,以及重定向,就是把傳入web的請求重定向到其他url的過程。

          一、rewrite介紹

          rewrite和location的功能有點相像,都能實現跳轉,主要區別在于rewrite常用于同一域名內更改獲取資源的路徑,而location是對一類路徑做控制訪問和反向代理,可以proxy_pass到其他服務器。

          Nginx提供的全局變量或自己設置的變量,結合正則表達式和標志位實現url重寫以及重定向。

          rewrite只能放在server{},location{},if{}中,

          并且只能對域名后邊的除去傳遞的參數外的字符串起作用。

          二、rewrite作用及應用場景

          Rewrite主要的功能就是實現URL的重寫,Nginx的Rewrite規則采用Pcre,perl兼容正則表達式的語法規則匹配,如果需要Nginx的Rewrite功能,在編譯Nginx之前,需要編譯安裝PCRE庫。通過Rewrite規則,可以實現規范的URL、根據變量來做URL轉向及選擇配置。

          作用: 實現對URL的重寫以及對匹配(正則表達式)的url的重定向

          場景:

          1. URL訪問跳轉, 支持開發設計

          ① 頁面跳轉 ② 兼容性支持 ③ 展示效果

          2. seo優化

          3. 維護

          ① 后臺維護 ② 流量轉發

          4. 安全

          ① 偽靜態頁面

          配置語法

          systax: rewrite [正則表達式 替換前的URL] [替換后的URL] [標識];

          default: 無配置

          二、ReWrite相關指令

          指令默認值使用范圍作用
          breaknoneif,server,location完成當前的規則集,不再處理rewrite指令,需要和last加以區分
          if ( condition ) { … }noneserver,location

          用于檢測一個條件是否符合,符合則執行大括號內的語句。不支持嵌套,不支持多個條件&&或處理

          returnnoneserver,if,location

          用于結束規則的執行和返回狀態碼給客戶端。狀態碼的值可以是204,400,402,406,408,410,411,413,416以及500~504,另外非標準狀態碼444,表示以不發送任何的Header頭來結束連接。

          rewrite regex replacement flag
          server,location,if

          該指令根據表達式來重定向URI,或者修改字符串。

          指令根據配置文件中的順序來執行。注意重寫表達式只對相對路徑有效。該指令根據表達式來重定向URI,或者修改字符串。指令根據配置文件中的順序來執行。注意重寫表達式只對相對路徑有效。

          uninitialized_variable_warn on/offonhttp,server,location,if該指令用于開啟和關閉未初始化變量的警告信息,默認值為開啟。
          set variable valuenone

          該指令用于定義一個變量,并且給變量進行賦值。

          變量的值可以是文本、一個變量或者變量和文本的聯合,文本需要用引號引起來。

          三、rewrite常用全局變量

          四、Nginx rewrite語法

          1、rewrite指令語法

          指令語法: rewrite regex replacement [flag]

          默認值: none

          應用位置:server、location、if

          rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部分的內容,重定向到replacement部分,結尾是flag標記。

          下面是一個簡單地URL rewrite跳轉的例子:

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

          在上述指令中,rewrite為固定關鍵字,表示開啟一條rewrite匹配規則,regex部分是^/(.*),這是一個正則表達式,表示匹配所有,匹配成功后跳轉到http://www.cjzzc.com/$1。這里的$1是取前面regex部分括號里的內容結尾的permanent;是永久301重定向標記,即跳轉到后面的http://www.cjzzc.com/$1地址上。

          2、rewrite指令結尾的flag標記說明

          flag標記符號說 明
          last本條規則匹配完成后,繼續向下匹配新的location URI規則
          break本條規則匹配完成即終止,不再匹配后面的任何規則
          redirect返回302臨時重定向,瀏覽器地址欄會顯示跳轉后的URL地址
          permanent返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址

          在以上的flag標記中,last和break用來實現URL重寫,瀏覽器地址欄的URL地址不變,但在服務器訪問的程序及路徑發生了變化。redirect和permanent用來實現URL跳轉,瀏覽器地址會顯示跳轉后的URL地址。

          last和break標記的實現功能類似,但二者之間有細微的差別,使用alias指令時必須用last標記,使用proxy_pass指令時要使用break標記。

          last標記在本條rewrite規則執行完畢后,會對其所在的server{…}標簽重新發起請求,而break標記則會在本條規則匹配完成后,終止匹配,不再匹配后面的規則。

          五、例子

          1、 break

          參數項:break,用于停止執行rewrite模塊的指令,但是其他模塊不受影響。

          配置位置:server,location,if

          示例

          server{listen80;server_namelocalhost;#=====break&&rewritetest=====#這里如果注釋掉break,所有請求進來都是返回http200,thisisbreaktest...break;return200"thisisbreaktest...";location=/breaktest{break;return200$request_uri;proxy_passhttp://192.168.88.38/other;}location/{return200$request_uri;}}#發送請求如下#curl127.0.0.1:8080/testbreak#/other#可以看到返回`/other`而不是`/testbreak`,說明`proxy_pass`指令還是被執行了#也就是說其他模塊的指令是不會被break中斷執行的#(proxy_pass是ngx_http_proxy_module的指令)

          測試鏈接:http://192.168.88.38/breaktest,請求到達server塊后,被break終止執行rewrite指令集,return屬于rewrite模塊指令集,所以return 200 “this is breaktest…”不會執行;

          因為沒有返回結果,所以繼續執行location匹配,請求匹配到location = /breaktest{}之后,break終止return 200 $request_uri,而proxy_pass屬于ngx_http_proxy_module,仍會繼續執行,

          反向代理后的新url匹配到location /{},因此最終返回結果為 http200,/other,如下圖:

          2、set

          配置位置:server,location,if,用于為變量賦值

          示例:

          server{listen80;server_namelocalhost;#=====break&&rewritetest=====#這里如果注釋掉break,所有請求進來都是返回http200,thisisbreaktest...break;return200"thisisbreaktest...";location=/breaktest{break;return200$request_uri;proxy_passhttp://192.168.88.38/other;}location/{#set賦值,可以直接賦字符串,或是變量,如下是變量和字符串的組合set$set_value_test“112233$request_uri”;return200$set_value_test;}}

          測試鏈接http://192.168.88.38/breaktest,使用效果如下圖:

          3.if

          配置位置:server,location,用于依據指定的條件,決定是否執行if塊中的語句

          判斷條件:

          3.1.變量值為空或為0,都為false;

          示例:

          set$if_value_test“0”;#注意這里if、()和{}要空格,否則會報錯..略坑,不過這也是代碼規范了if($if_value_test){#不會執行,因為$if_value_test值為0,falsereturn200;}

          3.2.變量與字符串比較,=為等于,!=為不等

          3.3.變量與正則表達式匹配,~ 為區分大小寫匹配,~* 為不區分大小寫匹配,!~ , !~*前面兩者的非操作

          示例:

          if($request_uri~“^/breaktest$”){#測試鏈接http://192.168.88.38/breaktest,最終返回http200return200;}

          3.4.檢查文件是否存在,-f存在即為true,!-f不存在即為true

          3.5.檢查目錄是否存在,-d存在即為true,!-d不存在即為true

          3.6.檢查文件或目錄是否存在,-e存在即為true,!-e不存在即為true

          3.7.檢查文件是否可執行,-x可執行即為true,!-x不可執行即為true

          示例:

          if(-e/usr/local/nginx/conf){return200;}

          其他示例:

          if($http_user_agent~MSIE){rewrite^(.*)$/msie/$1break;}//如果UA包含"MSIE",rewrite請求到/msid/目錄下if($http_cookie~*"id=([^;]+)(?:;|$)"){set$id$1;}//如果cookie匹配正則,設置變量$id等于正則引用部分if($request_method=POST){return405;}//如果提交方法為POST,則返回狀態405(Methodnotallowed)。return不能返回301,302if($slow){limit_rate10k;}//限速,$slow可以通過set指令設置if(!-f$request_filename){break;proxy_passhttp://127.0.0.1;}//如果請求的文件名不存在,則反向代理到localhost。這里的break也是停止rewrite檢查if($args~post=140){rewrite^http://mysite.com/permanent;}//如果querystring中包含"post=140",永久重定向到mysite.com
          1. if指令中,可以使用全局變量,這些變量有:

          2. $ args: #這個變量等于請求行中的參數,同$query_string

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

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

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

          6. $host: 請求主機頭字段,否則為服務器名稱。

          7. $http_user_agent: 客戶端agent信息

          8. $http_cookie: 客戶端cookie信息

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

          10. $request_method: 客戶端請求的動作,通常為GET或POST。

          11. $remote_addr: 客戶端的IP地址。

          12. $remote_port: 客戶端的端口。

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

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

          15. $scheme: HTTP協議(如http,https)。

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

          17. $server_addr: 服務器地址,在完成一次系統調用后可以確定這個值。

          18. $server_name: 服務器名稱。

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

          20. $request_uri: 包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。

          21. $ uri: 不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。

          22. $ document_uri: 與$uri相同。

          4.return

          配置位置:server,location,if

          參數值:return code [text]返回狀態碼及文本、return url重定向、return code url重定向

          5.rewrite

          配置位置:server,location,if

          參數值:rewrite regex replacement [flag],用于以正則表達式匹配特定格式的url并重寫url.

          regex為正則表達式,replacement為重寫的內容,flag為rewrite的標識位

          replacement:重寫的url帶http,表示重定向

          示例:

          location/{#測試鏈接http://192.168.88.38/test/,被重定向到百度首頁,后面的語句不會再執行rewrite/test/(.*)http://www.baidu.com;set$set_value_test"112233$request_uri";return200$set_value_test;}

          replacement:重寫的url不帶http,單純的重寫url

          示例:

          location/{#測試鏈接http://192.168.88.38/test/,匹配到location/{}后url被重寫為http://192.168.88.38/breaktest,繼續搜索匹配#匹配到location=/breaktest{},最終返回http200及thisisbreaktestrewrite/test/(.*)/breaktest;}location=/breaktest{return200"thisisbreaktest";}

          6、flag

          flag:用于設置重寫url后的進一步操作,有break,last,redirect,permanent,rewrite不帶flag時,多個rewrite指令順序執行,當location中沒有可執行的rewrite模塊指令時,重新發起一次location匹配,下面說明各個flag的用途:

          break:和上面講的break用途及用法一樣,終止執行rewrite模塊指令集;

          last:終止執行rewrite模塊指令集,并開始搜尋重寫url后匹配的location;

          redirect:臨時重定向

          permanent:永久重定向

          示例:

          location/{#測試鏈接http://192.168.88.38/test1,匹配到location/{}rewrite^/test1/test2;#被重寫為/test2,繼續往下執行rewriterewrite^/test2/test3;#被重寫為/test3,往下沒有可執行的rewrite模塊指令,發起一次location匹配,匹配到location/test3{},最終返回http200及/test3}location/test2{return200"/test2";}location/test3{return200"/test3";}

          last和break的區別在于,last會發起新的location匹配,而break不會。

          示例:

          location/{rewrite^/test1/test2;rewrite^/test2/test3last;rewrite^/test3/test4;}location/test2{return200"/test2";}location/test3{return200"/test3";}location/test4{return200"/test4";}

          測試鏈接:http://192.168.88.38/test1匹配到 location / {}后,被重寫為/test2,順序執行再次被重寫為/test3,因為flag為last,所以不會繼續重寫為/test4,而是發起一次location匹配,匹配到location /test3{},所以最終返回結果為http200及/test3;

          如果把location /{}中的last改為break,被重寫為/test3后,不再重寫為/test4,也不會發起location,最終沒有可匹配的資源,返回http404。

          7、正則匹配URL的參數傳遞

          小括號()之間匹配的內容,可以在后面通過 $下標 來引用,如1 表 示 引 用 第 一 個 小 括 號 匹 配 的 內 容 , 1表示引用靠前個小括號匹配的內容,1表示引用靠前個小括號匹配的內容,表示引用第二個小括號匹配的內容。

          示例:

          location/{rewrite^/(test1)/(test2)/(test3)/$2/$3;return200$2-$3;}

          最終返回結果:

          這是陽光明媚的一天,互聯網里風平浪靜,一切都是欣欣向榮。我就是在這樣一個平凡的日子里誕生了。我給自己起了個名字叫超,不過我的師哥師姐們都喜歡叫我小超。從出生的那...

          網上關于SEO優化的知識很多也很雜,很多新手都不知道如何選擇。本來耗子網站里每篇文章都有的詳細步驟的,考慮到很雜,于是耗子對各種SEO優化基礎知識進行了整理,但...

          今天,我給大家講講如何利用電影貼吧引流輕松變現。這個很適合新手。廢話不多說,直接上干貨。每上映一個新片子,只要這個片子有一定的熱度,馬上該片子的貼吧就會出現各種...

          網站百度SEO排名介紹:在百度搜索引擎中排名靠前對于網站來說非常重要,因為它會直接影響到網站的流量和曝光率。百度SEO排名是指網站在百度搜索結果頁面中的排序位置,一般是通過關鍵詞匹配算法來計算。在百度上排名靠前的網站往往擁有更高的曝光率和流量,因此更容易吸引用戶和客戶。提升百度SEO排名的5個方法:1.優化網站內容:良好的網站內容是提高排名的重要因素。包括網站的標題、描述、關鍵詞以及正文內容等。2...

          短視頻時代,如何拍好短視頻,常用的構圖技巧有哪些短視頻時代,如何能拍好短視頻成為大家非常關注的一個話題。為了拍攝更富有故事感更具美感的短視頻,常用的構圖技巧有哪些?新手應該如何去起步,拍攝有哪些技巧?這些都是大家在拍攝創作中常遇到的問題,今天就給大家講一講首先來了解一下鏡頭與構圖的重要性與那些新手常用的鏡頭小技巧,需要了解拍攝時想要表達的內容,從而更好地運用構圖和運鏡,讓畫面更加突出,更具有美感其...

          站群建設要注意哪些事項?網站群的建設對于沒有網絡和資金的新手網站管理員來說是必要的。大多數來自主頁的外部鏈接是通過友情鏈接實現的,但是由我們的主頁網站可以創建的友情鏈接的數量非常有限。此時,我們必須建立我們的資源站,使單向鏈接到主要網站或找到交叉鏈接到其他網站。在搜索引擎中,站群似乎是作弊的一種方式。雖然目前搜索引擎中還沒有完善的站群管理措施,但站群的建設仍需謹慎。本文總結了站群建設的6大要點。要...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>