nginx——rewrite模塊

1.什麼是Nginx的Rewrite規則?
Rewrite主要的功能就是實現URL的重寫,Nginx的Rewrite規則採用PCRE(Perl
Compatible Regular Expressions)Perl兼容正則表達式的語法進行規則匹配,若是php


您須要Nginx的Rewrite功能,在編譯Nginx以前,需要編譯安裝PCRE庫.
經過Rewrite規則,能夠實現規範的URL,根據變量來作URL轉向及選擇配置.正則表達式

(1)一些使用MVC框架的程序只有一個入口,能夠經過Rewrite來實現.
(2)一些動態URL地址需要假裝成靜態HTML,便於搜索引擎抓取,也須要Rewrite來處理
(3)一些因爲目錄結構,域名變化的舊URL,需要跳轉到新的URL上,能夠經過Rewrite來

處理.

2.Nginx Rewrite規則相關指令
if , rewrite , set , return , break
(1)break,完成當前的規則集,再也不處理rewrite指令.
(2)if 瀏覽器

語法: if(condition){...} 用於檢查一個條件是否符合,若是條件符合,則執行大括號內的語句.if指令不支持嵌 套,不支持多個條件&&和||處理. 如下信息能夠被指定爲條件: 1)變量名,其中錯誤的值包括:空字符串"",或者任何以0開始的字符串. 2)變量比較可使用=和!=運算符 3)"~"符號表示區分大小寫字母的匹配. 4)"~*"符號表示不區分大小寫字母的匹配.如firefox和FireFox是匹配的. 5)"!~"和"!~*"符號的做用恰好和"~","!~"相反,表示不匹配. 6)"-f"和"!-f"用來判斷文件是否存在. 7)"-d"和"!-d"用來判斷目錄是否存在. 8)"-e"和"!-e"用來判斷文件或目錄是否存在. 9)"-x"和"!-x"用來判斷文件是否可執行. (3)return 語法:return code 該指令用於結束規則的執行並返回狀態碼給客戶端.狀態碼可使用這些 值:204,400,402-406,408,410,413,416,及500-504.非標準狀態碼,444將以不發送 任何Header頭的方式結束鏈接. 403Forbidden.服務器已經理解請求,可是拒絕執行它. 404Not Found.請求失敗,請求所但願獲得的資源未在服務器上發現.404這個狀態碼 被普遍應用於當服務器不想揭示爲什麼請求被拒絕,或者沒有其餘適合的響應可用的情 況下. 500Internal Server Error.服務器遇到一個不曾預料的情況,致使它沒法完成對請 求的處理.通常來講,這個問題都會在服務器的程序碼出錯時出現. 502Bad Gateway.做爲網關或代理工做的服務器嘗試執行請求時,從上游服務器接收 到無效的響應. 503Service Unavailable.因爲臨時的服務器維護或過載,服務器當前沒法處理請求. 這個情況是臨時的,而且將在一段時間之後恢復.503狀態碼的存在並不意味着服務器 在過載的時候必須使用它.某些服務器只不過是但願拒絕客戶端的鏈接. 504 Gateway Timeout做爲網關或代理工做的服務器嘗試執行請求時,未能及時從上 遊服務器(URI標識出的服務器,例如HTTP,FTP,LDAP)或輔助服務器(例如DNS)收到響 應. (4)rewrite指令.語法:rewrite regex replacement flag .該指令根據表達式來重 定向URI,或者修改字符串.指令根據配置文件中的順序來執行.注意重寫表達式只對 相對路徑有效.若是想配對主機名,應該使用If語句. rewrite指令的最後一項參數爲flag標記,支持的flag標記有: last——至關於Apache裏的[L]標記,表示完成rewrite. break——本條規則匹配完成後,終止匹配,再也不匹配後面的規則. redirect——返回302臨時重定向,瀏覽器地址欄會顯示跳轉後的URL地址. permanent——返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址. 在以上標記中,last和break用來實現URI重寫,瀏覽器地址欄的URL地址不變,但在服 務器端訪問的路徑發生了變化.redirect和permanent用來實現URL跳轉,瀏覽器地址 欄會顯示跳轉後的URL地址. 1)通常在根location中(即location/{...})或直接在server標籤中編寫rewrite規則 .推薦使用last標記,在非根location中(location/cms/{...}),則使用break標記. 如: rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last ; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last ; return 403 ; location /download/{   rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break ;   rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break ;   return 403 ; } 2)若是被替換的URI中含有參數(即相似/app/test.php?id=5之類的URI),默認狀況 下參數會被自動附加到替換串上,你能夠經過在替換串的末尾加上?標記來解決這一 問題.不加?標記和加上?標記的URL跳轉區別: rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent ; 訪問http://www.yourdomain.com/test?id=5 通過301跳轉後的URL地址爲 http://www.yourdomain.com/home?id=5 rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent ; 訪問http://www.yourdomain.com/test?id=5 通過301跳轉後的URL地址爲 http://www.yourdomain.com/home (5)set指令.語法: set variable value .該指令用於定義一個變量,並給變量賦值. 變量的值能夠爲文本,變量及文本變量的聯合.例如: set $varname 'hello' ;u (6)uninitialized_variable_warn 指令. 語法uninitialized_variable_warn on| off 該指令用於開啓或關閉記錄關於未初始化變量的警告信息,默認值爲開啓. (7)Nginx Rewrite能夠用到的全局變量. 在if , location , rewrite 指令中,可使用如下局部變量. $args , $content_length , $content_type ,$document_root , $document_uri, $host , $http_user_agent , $http_cookie , $limit_rate , $request_body_file , $request_method , $remote_addr , $remote_port , $remote_user , $remote_filename , $request_uri , $query_string , $scheme ,$server_protocol , $server_addr , $server_name , $server_port , $uri  
相關文章
相關標籤/搜索