Nginx Location
Nginx由內核和模塊組成,其中內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端的請求映射到一個location block,而location是Nginx配置中的一個指令,用于訪問的URL匹配,而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應的工作。
- location功能是由ngx_http_index_module模塊提供的。
- location常放在server上下文。
- location匹配與location的放置順序無關,而是與location匹配規(guī)則的優(yōu)先級有關。
常見的location匹配的URL方式如下:
符號 | 解釋 |
---|---|
= | 字面精確匹配,精確到文件 |
^~ | URL的前綴匹配,不支持正則 |
~ | 正則匹配檢查,區(qū)分大小寫 |
~* | 正則匹配檢查,不區(qū)分大小寫 |
/ | 不帶任何前綴 |
location匹配優(yōu)先級如下:
(location =) > (location 完整路徑)> (location ^~) > (location ~) > (location ~*) > ( location部分起始路徑) > (location / )
Nginx Location規(guī)則案例:
1.只會匹配/,優(yōu)先級比location / 低,= file 匹配到file的優(yōu)先級最高。
location =/ { [ configuration L1 ] }
2.直接匹配到到file,優(yōu)先級最高。
location =/index.html { [ configuration L2 ] }
3.可以匹配任何請求,但是因為從 / 開始匹配,所有優(yōu)先級最低。
location / { [ configuration L3 ] }
4.匹配任何以/p_w_picpaths/開始的請求,并且停止匹配其他的loation;
location = /p_w_picpaths/ { [ configuration L4 ] }
5.匹配以html、txt、gif、jpg、jpeg結尾的URL文件請求, 但是所有/p_w_picpaths/目錄的請求將由 [Configuration L4]處理。
location ~* .(html|txt|gif|jpg|jpeg)$ { [ configuration L5] }
瀏覽器發(fā)起HTTP Request URI案例與Location規(guī)則案例匹配如下:
/ -> 匹配configuration L3; /index.html 匹配configuration L2; /p_w_picpaths/ 匹配configuration L4; /p_w_picpaths/logo.png 匹配configuration L4; /img/test.jpg 匹配configuration L5。
生產(chǎn)環(huán)境中無需在Nginx.conf配置文件中同時添加五種規(guī)則匹配,如下為企業(yè)生產(chǎn)環(huán)境Nginx Location部分配置代碼:
#匹配/,優(yōu)先級最低
location /
{
root /var/www/html/;
expires 60d;
}
#匹配靜態(tài)頁面,由本地解析
location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /var/www/html/;
expires 60d;
}
#匹配動態(tài)頁面,交給后端服務器
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,優(yōu)先級最高
location =/newindex.html
{
root /var/www/newwww/;
expires 60d;
}
Nginx Rewrite
Rewirte規(guī)則也稱為規(guī)則重寫,主要功能是實現(xiàn)瀏覽器訪問HTTP URL的跳轉,其正則表達式是基于Perl語言。通常而言,幾乎所有的WEB服務器均可以支持URL重寫。
Rewrite URL規(guī)則重寫的用途:
- 對搜索引擎優(yōu)化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取網(wǎng)站頁面;
- 隱藏網(wǎng)站URL真實地址,瀏覽器顯示更加美觀;
- 網(wǎng)站變更升級,可以基于Rewrite臨時重定向到其他頁面。
- Nginx Rewrite是由ngx_http_rewrite_module模塊提供;
- Nginx Rewrite可以使用正則替換URL,返回重定向頁面。
- Nginx Rewrite是按順序進行匹配的。
- Nginx Rewrite放在server,location,if上下文。
Nginx Rewrite規(guī)則使用中有三個概念需要理解,分別是:Rewrite結尾標識符、Rewrite規(guī)則常用表達式、Nginx Rewrite變量,如下為三個概念的詳解:
Rewrite結尾標識符:由于Rewrite規(guī)則末尾,表示規(guī)則的執(zhí)行屬性。
1.last :相當于Apache里的(L)標記,表示完成rewrite匹配,匹配完成后還會向下繼續(xù)匹配。
2.break:本條規(guī)則匹配完成后,終止匹配,不再匹配后面的規(guī)則.
3.redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址。
4.permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址。
其中l(wèi)ast和break用來實現(xiàn)URL重寫時,瀏覽器地址欄URL地址不變。
Rewrite規(guī)則常用表達式:要用于匹配參數(shù)、字符串及過濾設置。
符號 | 意義 |
---|---|
. | 匹配任何單個字符 |
[word] | 匹配字符串word |
[^word] | 不匹配字符串word |
aa|bb | 可選擇字符串a(chǎn)a|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 服務器發(fā)布目錄;
SERVER_PORT 服務器端口;
SERVER_PROTOCOL 服務器端協(xié)議;
TIME_YEAR 年;
TIME_MON 月;
TIME_DAY 日;
補充: if指令:
語法: if (condition) { … } 默認值: — 上下文: server, location
計算指定condition的值。計算指定的condition的值。如果為真,執(zhí)行定義在大括號中的rewrite模塊指令,并將if指令中的配置指定給請求。if指令會從上一層配置中繼承配置。
condition為下:
條件 | 解釋 |
---|---|
變量名 | 如何變量值為空或者以0開始的字符串,則為假 |
= | 運算符等于,則為真 |
!= | 運算符不等于,則為真 |
~ | 大小寫敏感,匹配變量和正則 |
~* | 大小寫不敏感,匹配變量和正則 |
-f | !-f | 檢查文件是否存在 |
-d | !-d | 檢查目錄是否存在 |
-e | !-e | 檢查文件,目錄或符號鏈接是否存在 |
-x | !-x | 檢查是否是可執(zhí)行文件 |
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.linuxidc.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]表示任意一個數(shù)字,+表示多個,(.+)表示任何多個字符。
rewrite ^/([0-9]+)/jj/(.+)$ /index.php?tid/$1/items=$2 permanent;