Nginx Location和Rewrite深入剖析
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規則案例:
只會匹配/,優先級比location / 低,= file 匹配到file的優先級最高。
location =/ { [ configuration L1 ] }
直接匹配到到file,優先級最高。
location =/index.html { [ configuration L2 ] }
可以匹配任何請求,但是因為從 / 開始匹配,所有優先級最低。
location / { [ configuration L3 ] }
匹配任何以/images/開始的請求,並且停止匹配其他的loation;
location = /images/ { [ configuration L4 ] }
匹配以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規則末尾,表示規則的執行屬性。
last :相當於Apache裏的(L)標記,表示完成rewrite匹配,匹配完成後還會向下繼續匹配。
break:本條規則匹配完成後,終止匹配,不再匹配後面的規則.
redirect:返回302臨時重定向,
瀏覽器地址會顯示跳轉後的URL地址。
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案例
將www.abc1.com 跳轉到 www.abc2.com
if ( $host = ‘www.abc1.com‘ ){ rewrite ^/(.*)$ http://www.abc2.com/$1 permanent; }
訪問www.abc1.com跳轉www.abc1.com/newindex.html
rewrite ^/$ http://www.abc1.com/newindex.html permanent;
訪問/test/跳轉到www.abc1.com/newindex.html
rewrite ^/test/$ http://www.abc1.com/newindex.html permanent;
多域名跳轉到 www.abc1.com
if ( $host != ‘www.abc1.com‘ ) { rewrite ^/(.*)$ http://www.abc1.com/$1 permanent; }
訪問文件和目錄不存在跳轉至index.html。
if ( !-e $request_filename ) { rewrite ^/(.*)$ /index.html last; }
目錄對換 /xxxx/123456 ====> /xxxx?id=123456
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
判斷瀏覽器User Agent跳轉。
if( $http_user_agent ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; }
禁止訪問以.sh,.flv,.mp3為文件後綴名的文件。
location ~ .*\.(sh|flv|mp3)$ { return 403; }
將移動用戶訪問跳轉至移動端。
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ) { rewrite ^/$ http://m.jfedu.net/ permanent; }
匹配URL訪任意字符串後面含有?tid=13就跳轉,$args 表示任意字符串
if ( $args ~* tid=13 ){ return 404; }
訪問/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深入剖析