Nginx高性能web服務器之URL重寫(五)

    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重寫的幾個例子,僅供參考!

相關文章
相關標籤/搜索