Nginx教程(四) Location配置與ReWrite語法php
語法規則: location [=|~|~*|^~] /uri/ {… }css
首先匹配 =,其次匹配^~,其次是按文件中順序的正則匹配,最後是交給 /通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。html
符號nginx |
含義web |
=正則表達式 |
= 開頭表示精確匹配chrome |
^~後端 |
^~開頭表示uri以某個常規字符串開頭,理解爲匹配 url路徑便可。nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意是空格)瀏覽器 |
~tomcat |
~ 開頭表示區分大小寫的正則匹配 |
~* |
~* 開頭表示不區分大小寫的正則匹配 |
!~和!~* |
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配的正則 |
/ |
用戶所使用的代理(通常爲瀏覽器) |
$http_x_forwarded_for |
能夠記錄客戶端IP,經過代理服務器來記錄客戶端的ip地址 |
$http_referer |
能夠記錄用戶是從哪一個連接訪問過來的 |
匹配規則示例:
location = / { #規則A } location = /login { #規則B } location ^~ /static/ { #規則C } location ~ \.(gif|jpg|png|js|css)$ { #規則D } location ~* \.png$ { #規則E } location !~ \.xhtml$ { #規則F } location !~* \.xhtml$ { #規則G } location / { #規則H }
那麼產生的效果以下:
1. 訪問根目錄/,好比http://localhost/將匹配規則A
2. 訪問 http://localhost/login 將匹配規則B,http://localhost/register則匹配規則H
3. 訪問 http://localhost/static/a.html 將匹配規則C
4. 訪問 http://localhost/a.gif,http://localhost/b.jpg 將匹配規則D和規則E,可是規則D順序優先,規則E不起做用,而http://localhost/static/c.png則優先匹配到規則C
5. 訪問 http://localhost/a.PNG 則匹配規則E,而不會匹配規則D,由於規則E不區分大小寫。
6. 訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,由於不區分大小寫。規則F,規則G屬於排除法,符合匹配規則可是不會匹配到,因此想一想看實際應用中哪裏會用到。
7. 訪問 http://localhost/category/id/1111 則最終匹配到規則H,由於以上規則都不匹配,這個時候應該是nginx轉發請求給後端應用服務器,好比FastCGI(PHP),tomcat(jsp),nginx做爲方向代理服務器存在。
#直接匹配網站根,經過域名訪問網站首頁比較頻繁,使用這個會加速處理。
#這裏是直接轉發給後端應用服務器了,也能夠是一個靜態首頁
# 第一個必選規則
location = / { proxy_passhttp://tomcat:8080/index }
# 第二個必選規則是處理靜態文件請求,這是nginx做爲http服務器的強項
# 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用
location ^~ /static/ { # 請求/static/a.txt 將被映射到實際目錄文件:/webroot/res/static/a.txt root /webroot/res/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)${ root /webroot/res/; }
第三個規則就是通用規則,用來轉發動態請求到後端應用服務器
#非靜態文件請求就默認是動態請求,本身根據實際把握
#畢竟目前的一些框架的流行,帶.php,.jsp後綴的狀況不多了
location / { proxy_pass http://tomcat:8080/ }
總結:
一、 先判斷精準命中,若是命中,當即返回結果並結束解析過程。
二、 判斷普通命中,若是有多個命中,「記錄」下來「最長」的命中結果(記錄但不結束,最長的爲準)。
三、 繼續判斷正則表達式的解析結果,按配置裏的正則表達式順序爲準,由上至下開始匹配,一旦匹配成功1個,當即返回結果,並結束解析過程。
四、 普通命中順序無所謂,是由於按命中的長短來肯定。正則命中,順序有所謂,由於是從前入日後命中的。
Nginx提供的全局變量或本身設置的變量,結合正則表達式和標誌位實現url重寫以及重定向。
rewrite只能放在server{},location{},if{}中,
而且只能對域名後邊的除去傳遞的參數外的字符串起做用。
Rewrite主要的功能就是實現URL的重寫,Nginx的Rewrite規則採用Pcre,perl兼容正則表達式的語法規則匹配,若是須要Nginx的Rewrite功能,在編譯Nginx以前,須要編譯安裝PCRE庫。
經過Rewrite規則,能夠實現規範的URL、根據變量來作URL轉向及選擇配置。
指令 |
默認值 |
使用範圍 |
做用 |
break |
none |
if,server,location |
完成當前的規則集,再也不處理rewrite指令,須要和last加以區分 |
if ( condition ) { ... } |
none |
server,location |
用於檢測一個條件是否符合,符合則執行大括號內的語句。不支持嵌套,不支持多個條件&&或||處理 |
return |
none |
server,if,location |
用於結束規則的執行和返回狀態碼給客戶端。狀態碼的值能夠是:204,400,402~406,408,410,411,413,416以及500~504,另外非標準狀態碼444,表示以不發送任何的Header頭來結束鏈接。 |
rewrite regex replacement flag |
|
server,location,if |
該指令根據表達式來重定向URI,或者修改字符串。指令根據配置文件中的順序來執行。注意重寫表達式只對相對路徑有效。 |
uninitialized_variable_warn on|off |
on |
http,server,location,if |
該指令用於開啓和關閉未初始化變量的警告信息,默認值爲開啓。 |
set variable value |
none |
|
該指令用於定義一個變量,而且給變量進行賦值。變量的值能夠是文本、一個變量或者變量和文本的聯合,文本須要用引號引發來。 |
rewrite全局變量表
變量 |
含義 |
$args |
這個變量等於請求行中的參數,同$query_string |
$content length |
請求頭中的Content-length字段。 |
$content_type |
請求頭中的Content-Type字段。 |
$document_root |
當前請求在root指令中指定的值。 |
$host |
請求主機頭字段,不然爲服務器名稱。 |
$http_user_agent |
客戶端agent信息 |
$http_cookie |
客戶端cookie信息 |
$limit_rate |
這個變量能夠限制鏈接速率。 |
$request_method |
客戶端請求的動做,一般爲GET或POST。 |
$remote_addr |
客戶端的IP地址。 |
$remote_port |
客戶端的端口。 |
$remote_user |
已經通過Auth Basic Module驗證的用戶名。 |
$request_filename |
當前請求的文件路徑,由root或alias指令與URI請求生成。 |
$scheme |
HTTP方法(如http,https)。 |
$server_protocol |
請求使用的協議,一般是HTTP/1.0或HTTP/1.1。 |
$server_addr |
服務器地址,在完成一次系統調用後能夠肯定這個值。 |
$server_name |
服務器名稱。 |
$server_port |
請求到達服務器的端口號。 |
$request_uri |
包含請求參數的原始URI,不包含主機名,如」/foo/bar.php?arg=baz」。 |
$uri |
不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。 |
$document_uri |
與$uri相同。 |
操做符 |
含義 |
= ,!= |
比較的一個變量和字符串。 |
~, ~* |
與正則表達式匹配的變量,若是這個正則表達式中包含},;則整個表達式須要用"或'包圍。 |
-f,!-f |
檢查一個文件是否存在。 |
-d, !-d |
檢查一個目錄是否存在。 |
-e,!-e |
檢查一個文件、目錄、符號連接是否存在。 |
-x, !-x |
檢查一個文件是否可執行。 |
if 語法格式 if 空格 (條件) { 重寫模式 } # 限制瀏覽器訪問 if ($http_user_agent ~ Firefox) { rewrite ^(.*)$ /firefox/$1 break; } if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_user_agent ~ Chrome) { rewrite ^(.*)$ /chrome/$1 break; }
# 限制IP訪問 if ($remote_addr = 192.168.197.142) { return 403; }
1.首先從日誌查出ip
修改conf配置文件
重啓配置文件訪問發現
#判斷目錄是否存在
#服務器內部的rewrite和302跳轉不同.跳轉的話URL都變了,變成從新http請求index.html,而內部rewrite,上下文沒變。
if (!-e $document_root$fastcgi_script_name) { rewrite ^.*$ /index.html break; }
# set指令是設置變量用的,能夠用來達到多條件判斷時做標誌用
#判斷IE並重寫,且不用break;咱們用set變量來達到目的
if ($http_user_agent ~* msie) { set $isie 1; } if ($fastcgi_script_name = ie.html) { set $isie 0; } if ($isie 1) { rewrite ^.*$ ie.html; }
經常使用例子
(1)表示訪問路徑有a,b,c,d都跳轉到//127.0.0.1:8080$Request_uri
location ~^/(a|b|c|d){ proxy_pass http://127.0.0.1:8080$Request_uri; client_max_body_size 10240k; client_body_buffer_size 128k; }