nginx 路由配置
nginx中l(wèi)ocation對(duì)url匹配;
語(yǔ)法:location [=|~|~*|^~] /uri/ { … }
當(dāng)匹配中符合條件的location,則執(zhí)行內(nèi)部指令;如果使用正則表達(dá)式,必須使用~*表明不區(qū)分大小寫或者~區(qū)分大小寫匹配;例如:location ~* \.(gif|jpg|jpeg)$ ;當(dāng)配皮成功后,將停止往下匹配;如果沒(méi)有找到,則使用常規(guī)自字符串處理結(jié)果;
如果不是用正則表達(dá)式;可使用=嚴(yán)格匹配;
如果使用^~前綴用于一個(gè)常規(guī)字符串;表示如果路徑匹配,則不測(cè)試正則表達(dá)式;
總結(jié):指令按下列順序被接受
1:=前綴的指令嚴(yán)格匹配這個(gè)查詢;如果找到停止往下匹配
2:掙下的常規(guī)字符串,長(zhǎng)的在前,如果這個(gè)匹配使用^~前綴,匹配停止;
3:正則表達(dá)式,按配置文件的順序;
4:如果第三步產(chǎn)生匹配。則使用這個(gè)結(jié)果;停止匹配;否則使用第二部的匹配結(jié)果;
四個(gè)案例:
location = / {#只匹配/查詢}location / {#匹配任何查詢,所有請(qǐng)求都是以/開(kāi)頭。但是正則表達(dá)式規(guī)則和長(zhǎng)的塊規(guī)則將被優(yōu)先匹配和查詢;}location ^~ /images/ {# 匹配任何已 /images/ 開(kāi)頭的任何查詢并且停止搜索。任何正則表達(dá)式將不會(huì)被測(cè)試。}location ~* \.(gif|jpg|png)${#匹配任何以gif、jpg、png結(jié)尾的請(qǐng)求。然后所有/images/目錄的請(qǐng)求將使用第三個(gè)}例子請(qǐng)求:/ -> configuration A/documents/document.html -> configuration B/images/1.gif -> configuration C/documents/1.jpg -> configuration D?
八個(gè)location案例
location = / { #精確匹配,/后面不能加任何字符串,符合此條件就直接返回?cái)?shù)據(jù),不再像下匹配。if (-d $request_filename) {root /usr/local/nginx/html/; #當(dāng)用戶訪問(wèn)newweb的時(shí)候,則顯示此目錄的內(nèi)容,除此之外訪問(wèn)其他的任何目錄都不匹配。[動(dòng)作A] }location / {# 因?yàn)樗械牡刂范家?/span>/開(kāi)頭,所以這條規(guī)則將匹配到所有請(qǐng)求,但是非精確匹配會(huì)采取正則和最長(zhǎng)字符串會(huì)優(yōu)先匹配,因此還會(huì)向下繼續(xù)匹配,比如當(dāng)訪問(wèn)/bbs的時(shí)候,還需要看下面是否更精確的匹配。[ 動(dòng)作B] }location /documents/ {# 匹配任何以 /documents/ 開(kāi)頭的地址,匹配符合以后,還要繼續(xù)往下搜索# 如果后面的正則表達(dá)式都沒(méi)有匹配到,就匹配這一條[動(dòng)作C] }location ^~ /images/ { #匹配任何以/images/ 開(kāi)頭的任何請(qǐng)求并且停止搜索,后面任何正則表達(dá)式將不會(huì)被測(cè)試。# 匹配任何以 /images/ 開(kāi)頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。[動(dòng)作D] }location ~* \.(gif|jpg|jpeg)$ { #~*為不區(qū)分大小寫# 匹配所有以 gif,jpg或jpeg 結(jié)尾的請(qǐng)求# 然而,所有請(qǐng)求/images/下的圖片會(huì)被動(dòng)作D匹配處理,因?yàn)閯?dòng)作D有^~會(huì)優(yōu)先匹配并終止匹配,所以到達(dá)不了這一條正則[動(dòng)作E] }location /images/ {# 字符匹配到 /images/,繼續(xù)往下,會(huì)發(fā)現(xiàn) ^~ 存在,如果動(dòng)作D存在,則這一條就不生效。[動(dòng)作F] }location /images/abc {#最長(zhǎng)字符匹配到 /images/abc,繼續(xù)往下,會(huì)發(fā)現(xiàn) ^~ 存在,如果D存在,則這一條就不生效。#F與G的放置順序是沒(méi)有關(guān)系的[動(dòng)作G] }location ~ /images/abc/ {# 動(dòng)作D存在,這一條不生效,如果注銷動(dòng)作D,則會(huì)優(yōu)先最長(zhǎng)匹配 動(dòng)作G 開(kāi)頭的地址,然后向下匹配,到這一條的時(shí)候就會(huì)匹配并生效。[ configuration H ] }匹配優(yōu)先級(jí),順序 no優(yōu)先級(jí): (location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)上面的匹配結(jié)果 按照上面的location寫法,以下的匹配示例成立:/ -> config A 精確完全匹配,即使/index.html也匹配不了/downloads/download.html -> config B 匹配B以后,往下沒(méi)有任何匹配,采用B/images/1.gif -> configuration D 匹配到F,往下匹配到D,停止往下/images/abc/def -> config D 最長(zhǎng)匹配到G,往下匹配D,停止往下 你可以看到 任何以/images/開(kāi)頭的都會(huì)匹配到D并停止,FG寫在這里是沒(méi)有任何意義的,H是永遠(yuǎn)輪不到的,這里只是為了說(shuō)明匹配順序/documents/document.html -> config C 匹配到C,往下沒(méi)有任何匹配,采用C/documents/1.jpg -> configuration E 匹配到C,往下正則匹配到E/documents/Abc.jpg -> config CC 最長(zhǎng)匹配到C,往下正則順序匹配到CC,不會(huì)往下到E?
當(dāng)匹配成功后location中可以使用rewrite進(jìn)行路由重寫;
首先需要了解nginx rewrite中可以使用到的全局變量;
$args :請(qǐng)求中g(shù)et的參數(shù),例如a=1&b=2;
$body_remote_add :二進(jìn)制客戶地址
$body_byte_sent :相應(yīng)時(shí)發(fā)送出去的body字節(jié)數(shù)數(shù)量,即使鏈接中斷這個(gè)數(shù)據(jù)也是精確的;
$content_length :請(qǐng)求頭中的Content_length字段
$content_type :請(qǐng)求中的Content_type字段
$document_root :當(dāng)前請(qǐng)求在root指令中的位置;服務(wù)器中絕對(duì)路徑
$document_url :與uri相同
$host :請(qǐng)求主機(jī)頭字段,否則為服務(wù)器名稱;
$hostname :保存了當(dāng)前請(qǐng)求中不包含指令的uri,例如:http://www.aaa.com/index.php?a=1中的/index.php;
$host :請(qǐng)求的服務(wù)器名稱;
$http_user_agent :客戶端瀏覽器的詳細(xì)信息,如果使用 chrome 和Firefox 則訪問(wèn)結(jié)果是
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 #chrome的瀏覽器信息 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0 #Firefox的瀏覽器信息$http_cookie : 客戶端cookie信息;
$limit_rate :如果nginx服務(wù)器中使用limit_rate配置了顯示網(wǎng)絡(luò)速率,則會(huì)顯示,如果沒(méi)有則為0
$remote_addr :客戶端的地址,每個(gè)客戶端的公網(wǎng)ip,
$remote_port :客戶端請(qǐng)求nginx服務(wù)器時(shí)隨機(jī)打開(kāi)的端口,這個(gè)每個(gè)客戶端自己的端口;
$remote_user :已經(jīng)經(jīng)過(guò)auth basic module驗(yàn)證的用戶名
$request_body_file :作反向代理是發(fā)給服務(wù)端的本地資源名稱
$request_method :請(qǐng)求志愿的方式,get\put\delete等
$request_filename :請(qǐng)求的資源文件的路徑名稱
$request_url :請(qǐng)求參數(shù)的原始uri,不包含主機(jī)名;如"/index.php?a=1"
$squery_string :保存了url請(qǐng)求的指令,與$args相同
$scheme :請(qǐng)求協(xié)議;如http、https、ftp
$server_protacpl :保存了客戶端請(qǐng)求資源使用的協(xié)議的版本,如http/1.0、http/1.1
$server_addr :保存了服務(wù)器ip
$server_name :保存了服務(wù)器的主機(jī)名;該變量不一定是用戶訪問(wèn)的域名,是你的server_name配的地址;
$host :保存了用戶訪問(wèn)的域名
$server_port :服務(wù)器端口
$uri與$document_uri相同 :不包含指令的uri地址
如www.aaa.com/index.php?a=1&b=2中的index.php
?
防盜鏈:注意location生效規(guī)則,否則防盜鏈不起作用。
配置參數(shù)說(shuō)明:
none
'Referer' :來(lái)源頭部為空的情況
blocked
'Referer' :來(lái)源頭部不為空,但里面的值被代理或者防火墻刪除,這些值都不以http://或者h(yuǎn)ttps://開(kāi)頭
server_names
'Referer' :來(lái)源頭部包含當(dāng)前的server_name,就是域名
arbitary string :任意字符串,定義服務(wù)器名或者可選的url前綴,主機(jī)名可以使用*開(kāi)頭或者結(jié)尾,在檢測(cè)來(lái)源頭部這個(gè)過(guò)程中,來(lái)源域名中的主機(jī)端口將會(huì)被忽視;
regular expression :正則表達(dá)式,表示排除https://或者h(yuǎn)ttp://開(kāi)頭的字符串
下面兩個(gè)案例:
location ~* \.(gif|jpg|png|bmp)$ {valid_referers none blocked *.aaa.com server_names ~\.google\. ~\.baidu\.;if ($invalid_referer) {return 403;#rewrite ^/ http://www.aaa.com/1.jpg; ?? ?} }以上所有來(lái)至aaa.com和域名中包含google和baidu的站點(diǎn)都可以訪問(wèn)到當(dāng)前站點(diǎn)的圖片,如果來(lái)源域名不在這個(gè)列表中,那么$invalid_referer等于1,在if語(yǔ)句中返回一個(gè)403給用戶,這樣用戶便會(huì)看到一個(gè)403的頁(yè)面,如果使用下面的rewrite,那么盜鏈的圖片都會(huì)顯示403.jpg。如果用戶直接在瀏覽器輸入你的圖片地址,那么圖片顯示正常,因?yàn)樗蟦one這個(gè)規(guī)則.
location ~* \.(gif|jpg|png|swf|flv)$ { # 防盜鏈設(shè)置,對(duì)于后綴是gif、jgp等格式的生效valid_referers none blocked a.com *.a.com; #定義允許訪問(wèn)的請(qǐng)求鏈接if ($invalid_referer) {return 404;} }none:在瀏覽器輸入網(wǎng)站域名直接訪問(wèn)的請(qǐng)求,需要允許訪問(wèn)的 blocked:有referer首部,但是referer首部被清除了,一般是防火墻改過(guò)的請(qǐng)求 server_name:帶服務(wù)器名稱的,一般是本機(jī)或其他服務(wù)器的請(qǐng)求,a.com和*.a.com是本公司的域名,要允許訪問(wèn)于是要先允許本機(jī)的訪問(wèn),再禁止其他服務(wù)器的訪問(wèn) location /public/admin/images/y.jpg {#valid_referers none blocked *.aaa.com server_names *.aaa.com ;#valid_referers none blocked www.sss.com; #設(shè)置只有該域> 名可以訪問(wèn)valid_referers none blocked 111.111.111.11; #設(shè)置只有該域名可以訪> 問(wèn)if ($invalid_referer) {rewrite ^ http://baidu.com$request_uri?;return 403;rewrite ^/ http://www.aaa.com/1.jpg; }}
?
常用正則匹配
. : 匹配除換行符以外的任意字符 ? : 重復(fù)0次或1次 + : 重復(fù)1次或更多次 * : 重復(fù)0次或更多次 \d :匹配數(shù)字 ^ : 匹配字符串的開(kāi)始 $ : 匹配字符串的介紹 {n} : 重復(fù)n次 {n,} : 重復(fù)n次或更多次 [c] : 匹配單個(gè)字符c [a-z] : 匹配a-z小寫字母的任意一個(gè) 小括號(hào)()之間匹配的內(nèi)容,可以在后面通過(guò)$1來(lái)引用,$2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符。?
參考if判斷語(yǔ)句
if ($http_user_agent ~ MSIE) { #如果客戶端是微軟的IE瀏覽器,就將請(qǐng)求rewrite到msie目錄下。rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { # 如果cookie匹配正則,就設(shè)置變量$id等于正則引用部分set $id $1; 設(shè)置$id等于正則第一個(gè)括號(hào)內(nèi)匹配的部分} if ($request_method = POST) { #如果提交方法為POST,則返回狀態(tài)405(Method not allowed)。return不能返回301,302return 405; } if ($slow) { #限速,$slow可以通過(guò) set 指令設(shè)置limit_rate 10k; } if (!-f $request_filename){ #如果請(qǐng)求的文件名不存在,則反向代理到localhost 。這里的break也是停止rewrite檢查break;proxy_pass http://127.0.0.1; } if ($args ~ post=140){ #如果query string中包含"post=140",永久重定向到example.comrewrite ^ http://example.com/ permanent; }?
nginx 配置案例參考
http {# 定義image日志格式log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;# 開(kāi)啟重寫日志rewrite_log on;server {root /home/www;location / {# 重寫規(guī)則信息error_log logs/rewrite.log notice; # 注意這里要用‘’單引號(hào)引起來(lái),避免{}rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;# 注意不能在上面這條規(guī)則后面加上“l(fā)ast”參數(shù),否則下面的set指令不會(huì)執(zhí)行set $image_file $3;set $image_type $4;}location /data {# 指定針對(duì)圖片的日志格式,來(lái)分析圖片類型和大小access_log logs/images.log mian;root /data/images;# 應(yīng)用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,如果還不在就跳轉(zhuǎn)到最后一個(gè)url里try_files /$arg_file /image404.html;}location = /image404.html {# 圖片不存在返回特定的信息return 404 "image not found\n";} }?
轉(zhuǎn)載于:https://www.cnblogs.com/jackylee92/p/6836948.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的nginx 路由配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端完全分离和前端不完全分离
- 下一篇: jquery.ui.datepicker