Nginx的URL重寫模塊用的不少。經常使用的URL重寫模塊命令有if,rewrite,set,break等。
css
1、if命令html
if命令的使用方法以下:nginx
語法:if(condition){...}web
默認值:none正則表達式
使用字段:server,location瀏覽器
默認狀況下,if命令默認值爲空,能夠在Nginx配置文件的server,location部分使用,if命令還能夠在判斷語句中指定正則表達式或者匹配條件等。bash
正則表達式匹配:服務器
~:表示區分大小寫匹配app
~*:表示不區分大小寫匹配webapp
!~和!~*分別表示區分大小寫不匹配和不區分大小寫不匹配
文件和目錄匹配:
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行
Nginx的配置文件中有不少內存變量,這裏變量能夠和if命令一塊兒用。常見的變量有以下幾種:
$args:此變量與請求行中的參數相等
$document_root:等同於當前請求的root命令指定的值
$uri:等同於當前request中的URI
$document_uri:與$uri同樣
$host:與請求頭部中的「Host」行指定的值同樣
$limit_rate:用來設置限制鏈接的速率
$request_method:等同於request的method。通常是「GET」或"POST"
$remote_addr:表示客戶端IP地址
$remote_port:表示客戶端端口
$remote_user:表示用戶名,由ngx_http_auth_basic_module認證
$request_filename:表示當前請求的文件路徑名,由root或alais與URI request組成
$request_uri:表示含含有參數的完整初始URI
$request_string:與$args同樣
$server_name:請求到達的服務器名
$server_port:請求到達的服務器端口號
瞭解相關的if命令規則和Nginx的內在變量後,下面是一個server配置段例子:
server { listen 80; server_name www.a.com; access_log logs/host.access.log main; location / { root /var/www/html; index index.html index.htm; } location ~.*\(htm|html|gif|jpg|jpeg|png|bmp|swf|js|css)$ { root /usr/local/nginx/www/img; if (! -f $request_filename) { root /var/www/html/img; } if (! -f $request_filename) { root /apps/p_w_picpaths; } } location ~.*\. (jsp)${ root /webdata/webapp/www/ROOT; if (! -f $request_filename) { root /usr/local/nginx/www/jsp; } proxy_pass http://127.0.0.1:8888; } }
這段代碼主要完成對www.a.com這個域名的資源訪問設置。www.a.com這個域名的根目錄爲"/var/www/html"。
靜態資源分別位於"/usr/local/nginx/www/img"、"/var/www/html/img"、"/apps/p_w_picpaths"這三個目錄下面。請求靜態資源的方式是依次從這三個目錄下面查找。若是第一個目錄不存在的話,就去找第二個目錄。以此類推,如都找不到的話,就返回404錯誤。
動態資源分別位於"/webdata/webapp/www/ROOT"和"/usr/local/nginx/www/jsp"兩個目錄下面。若是客戶端請求的資源是以jsp結尾的文件,那麼依次在這兩個動態程序目錄中查找資源。若是沒有在這兩個目錄中定義的資源,那麼將在從根目錄"/var/www/html"中進行查找。
2、rewrite命令
Nginx是經過ngx_http_rewrite_module模塊支持URL重寫和if條件判斷的,若是要使用rewrite功能,須要pcre的支持。因此咱們在編譯安裝Nginx的時候,記得要指定pcre源碼的安裝目錄。
rewrite的使用方法以下:
語法:rewrite regex flag
默認值:none
使用字段:server location if
默認狀況下,rewrite命令值是空的,能夠在Nginx配置文件的server location if部分使用。rewrite的命令最後一個參數爲flag標記。支持的flag標記主要有如下幾種:
last :至關於Apache裏面的[L]標記,表示完成rewrite以後搜索相應的URI或location
break:表示終止匹配,再也不匹配後面的規則
redirect:將返回302臨時重定向,在瀏覽器地址會顯示跳轉後的URL地址
permanent:將返回301永久重定向,在瀏覽器地址會顯示跳轉後的URL地址
其中,last和break用來實現URL重寫,瀏覽器地址欄中的URL地址不變,下面是一個實例配置:
location ~ ^/best/ { rewrite ^/best/(.*) /test/$1 break; proxy_pass http://www.a.com; }
這個例子用了break標記,能夠實現將請求http://www.a.com/best/webinfo.html的頁面重定向到
http://www.b.com/test/webinfo.html頁面而不引發瀏覽器地址欄中的URL變化。這個功能在新舊網站交替的時候很是有用。
3、set命令
經過set命令能夠設置一個變量而且爲其賦值。值能夠爲文本,變量或它們的組合。也可使用set定義一個新的變量,可是不能使用set設置$http_xxx頭部變量的值。
set的使用方法以下:
語法:set variable value
默認值:none
使用字段:server location if
默認狀況下,set命令默認值是空的,能夠在Nginx配置文件的server location if部分使用,下面是一個配置例子:
location / { proxy_pass http://127.0.0.1:8080/; set $query $query_string; rewrite /dede /wordpress?$query?; }
這個例子,要實現請求爲http://www.a.com/wp/?p=160的頁面重寫到地址http://www.b.com/wordpress/?p=160 也就是重寫帶參數的URL。這裏涉及$query_string變量。這個變量至關於請求行中的參數,也就是"?"後面的內容。也能夠用$args代替$query_string變量。
4、break命令
break表示完成當前的設置規則後,再也不匹配後面的重寫規則。
break的使用方法以下:
語法:break
默認值:none
使用字段:server location if
在默認狀況下,break的命令值也是空的。能夠在Nginx的配置文件的server location if部分使用。下面是一個配置實例:
server { listen 80; server_name www.a.com www.b.com; if ($host != ‘www.a.com’) { rewrite ^/(.*)$ http://www.a.com/error.txt; break; rewrite ^/(.*)$ http://www.a.com/$1 permanent; } }
這個例子定義了兩個域名www.a.com和www.b.com 當經過域名www.a.com訪問網站時,會將請求重定向到http://www.a.com/error.txt的頁面。因爲設置了break命令,因此下面的rewrite就不會再執行,直接退出!
好了,以上就是一些關於URL重寫的幾個例子,僅供參考!