1. 程式人生 > >Nginx Location和Rewrite深入剖析

Nginx Location和Rewrite深入剖析

nginx rewrite location

Nginx Location和Rewrite深入剖析

Nginx Location

Nginx由內核和模塊組成,其中內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端的請求映射到一個location block,而location是Nginx配置中的一個指令,用於訪問的URL匹配,而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應的工作。

  • location功能是由ngx_http_index_module模塊提供的。

  • location常放在server上下文。

  • location匹配與location的放置順序無關,而是與location匹配規則的優先級有關。

常見的location匹配的URL方式如下:

符號解釋
=字面精確匹配,精確到文件
^~URL的前綴匹配,不支持正則
~正則匹配檢查,區分大小寫
~*正則匹配檢查,不區分大小寫
/不帶任何前綴

location匹配優先級如下:

(location =) > (location 完整路徑)> (location ^~) > (location ~) > (location ~*) > ( location部分起始路徑) > (location / )

Nginx Location規則案例:

  1. 只會匹配/,優先級比location / 低,= file 匹配到file的優先級最高。

    location =/ {
     [ configuration L1  ]
     }
  2. 直接匹配到到file,優先級最高。

    location =/index.html {
     [ configuration L2  ]
     }
  3. 可以匹配任何請求,但是因為從 / 開始匹配,所有優先級最低。

    location / {
     [ configuration L3  ]
     }
  4. 匹配任何以/images/開始的請求,並且停止匹配其他的loation;

    location = /images/ {
      [ configuration L4 ] 
     }
  5. 匹配以html、txt、gif、jpg、jpeg結尾的URL文件請求, 但是所有/images/目錄的請求將由 [Configuration L4]處理。

    location ~* \.(html|txt|gif|jpg|jpeg)$ { 
      [ configuration L5]
      }

瀏覽器發起HTTP Request URI案例與Location規則案例匹配如下:

	/ -> 匹配configuration L3;
	/index.html 匹配configuration L2;   
	/images/ 匹配configuration L4;
	/images/logo.png 匹配configuration L4;
	/img/test.jpg 匹配configuration L5。

生產環境中無需在Nginx.conf配置文件中同時添加五種規則匹配,如下為企業生產環境Nginx Location部分配置代碼:

#匹配/,優先級最低
location /
{
    root /var/www/html/;
	expires      60d;
}
#匹配靜態頁面,由本地解析
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
	root /var/www/html/;   
	expires      60d;      
}
#匹配動態頁面,交給後端服務器
location ~ .*\.(jsp|php|cgi|do)$
{
    root /var/www/html/;
    proxy_pass http://linux_web;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Host  $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
}
#直接匹配newindex.html,優先級最高
location =/newindex.html
{
    root /var/www/newwww/;
	expires      60d;
}

Nginx Rewrite

Rewirte規則也稱為規則重寫,主要功能是實現瀏覽器訪問HTTP URL的跳轉,其正則表達式是基於Perl語言。通常而言,幾乎所有的WEB服務器均可以支持URL重寫。

Rewrite URL規則重寫的用途:

  • 對搜索引擎優化(Search Engine Optimization,SEO)友好,利於搜索引擎抓取網站頁面;

  • 隱藏網站URL真實地址,瀏覽器顯示更加美觀;

  • 網站變更升級,可以基於Rewrite臨時重定向到其他頁面。

  • Nginx Rewrite是由ngx_http_rewrite_module模塊提供;

  • Nginx Rewrite可以使用正則替換URL,返回重定向頁面。

  • Nginx Rewrite是按順序進行匹配的。

  • Nginx Rewrite放在server,location,if上下文。

Nginx Rewrite規則使用中有三個概念需要理解,分別是:Rewrite結尾標識符、Rewrite規則常用表達式、Nginx Rewrite變量,如下為三個概念的詳解:

Rewrite結尾標識符:由於Rewrite規則末尾,表示規則的執行屬性。

  1. last :相當於Apache裏的(L)標記,表示完成rewrite匹配,匹配完成後還會向下繼續匹配。

  2. break:本條規則匹配完成後,終止匹配,不再匹配後面的規則.

  3. redirect:返回302臨時重定向,

    瀏覽器地址會顯示跳轉後的URL地址

  4. permanent:返回301永久重定向,

    瀏覽器地址欄會顯示跳轉後的URL地址

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

Rewrite規則常用表達式:要用於匹配參數、字符串及過濾設置。

符號意義
.匹配任何單個字符
[word]匹配字符串word
[^word]不匹配字符串word
aa|bb可選擇字符串aa|bb
?匹配0到1個字符
*匹配0到多個字符
+匹配1到多個字符
^字符串開始標誌
$字符串結尾標誌
\n轉義字符

Rewrite變量:常用於匹配HTTP請求頭信息、瀏覽器主機名、URL等。

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;
connection & request: REMOTE_ADDR, QUERY_STRING;
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
system stuff: TIME_YEAR, TIME_MON, TIME_DAY。

詳解如下:
HTTP_USER_AGENT 	用戶使用的代理,例如瀏覽器;
HTTP_REFERER		告知服務器,從哪個頁面來訪問的;
HTTP_COOKIE             客戶端緩存,主要用於存儲用戶名和密碼等信息;
HTTP_HOST		匹配服務器ServerName域名;
HTTP_ACCEPT		客戶端的瀏覽器支持的MIME類型;	
REMOTE_ADDR		客戶端的IP地址
QUERY_STRING		URL中訪問的字符串;
DOCUMENT_ROOT	        服務器發布目錄;
SERVER_PORT		服務器端口;
SERVER_PROTOCOL		服務器端協議;
TIME_YEAR		年;
TIME_MON		月;
TIME_DAY		日;

補充: if指令:

語法:	if (condition) { ... }
默認值:	—
上下文:	server, location

計算指定condition的值。計算指定的condition的值。如果為真,執行定義在大括號中的rewrite模塊指令,並將if指令中的配置指定給請求。if指令會從上一層配置中繼承配置。

condition為下:

條件解釋
變量名如何變量值為空或者以0開始的字符串,則為假
=運算符等於,則為真
!=運算符不等於,則為真
~大小寫敏感,匹配變量和正則
~*大小寫不敏感,匹配變量和正則
-f | !-f檢查文件是否存在
-d | !-d檢查目錄是否存在
-e | !-e檢查文件,目錄或符號鏈接是否存在
-x | !-x檢查是否是可執行文件

Nginx Rewrite案例

  1. 將www.abc1.com 跳轉到 www.abc2.com

    if ( $host = ‘www.abc1.com‘ ){
       rewrite ^/(.*)$ http://www.abc2.com/$1 permanent;
     }
  2. 訪問www.abc1.com跳轉www.abc1.com/newindex.html

    rewrite ^/$ http://www.abc1.com/newindex.html permanent;
  3. 訪問/test/跳轉到www.abc1.com/newindex.html

    rewrite ^/test/$ http://www.abc1.com/newindex.html permanent;
  4. 多域名跳轉到 www.abc1.com

    if ( $host != ‘www.abc1.com‘ ) {
     rewrite ^/(.*)$  http://www.abc1.com/$1  permanent;
     }
  5. 訪問文件和目錄不存在跳轉至index.html。

    if ( !-e $request_filename )
     {
     rewrite  ^/(.*)$  /index.html  last;
     }
  6. 目錄對換 /xxxx/123456 ====> /xxxx?id=123456

    rewrite ^/(.+)/(\d+)  /$1?id=$2 last;
  7. 判斷瀏覽器User Agent跳轉。

    if( $http_user_agent  ~ MSIE)
    {
    rewrite ^(.*)$ /ie/$1 break;
    }
  8. 禁止訪問以.sh,.flv,.mp3為文件後綴名的文件。

    location ~ .*\.(sh|flv|mp3)$
     {
     	return 403;
     }
  9. 將移動用戶訪問跳轉至移動端。

    if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )
     {
     rewrite ^/$      http://m.jfedu.net/       permanent;
     }
  10. 匹配URL訪任意字符串後面含有?tid=13就跳轉,$args 表示任意字符串

    if ( $args ~* tid=13 ){
     return 404;
    }
  11. 訪問/10690/jj/123跳轉至/index.php?tid/10690/items=123,[0-9]表示任意一個數字,+表示多個,(.+)表示任何多個字符。

    rewrite   ^/([0-9]+)/jj/(.+)$     /index.php?tid/$1/items=$2     permanent;


本文出自 “dianel簡單不簡單” 博客,請務必保留此出處http://dianel.blog.51cto.com/12170393/1964092

Nginx Location和Rewrite深入剖析