location配置語法規則: location [=||*|^~] /uri/ { … }
= 開頭表示精確匹配
^~ 普通字符匹配 , 但是如果字符匹配到了就不再繼續執行正則匹配 (普通的字符匹配完畢會記錄最長的匹配記錄,但是不會立刻選定, 而是繼續進行正則匹配, 如果正則匹配符合就按照正則匹配執行) ,。
~ 開頭表示區分大小寫的正則匹配
~* 開頭表示不區分大小寫的正則匹配
!和!*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
匹配規則
首先尋找精準匹配, 如果有則停止匹配
沒有則匹配普通匹配 --> 如果有多個匹配 則記錄最長匹配結果
匹配正則表達式 --> 如果有匹配-->立即返回, 如果沒有-->返回普通匹配最長匹配結果
location 命中過程:
- 先判斷精準命中,如果命中,則立即返回結果并結束解析過程
- 判斷普通命中, 如果有多個命中,記錄下來最長的命中結果(注意:是記錄但并不結束,記錄的是最 長的命中)
- 繼續判斷正則表達式的解析結果,按配置里的正則表達式順序為準,由上到下開始匹配,一旦匹配成功一個, 立即返回結果,并結束解析過程
拓展:
普通命中時,匹配順序無所謂,因為會全部匹配一遍然后命中最長匹配
正則命中時,匹配順序很重要,因為是從上到下匹配,一旦命中就直接結束匹配
===================================================
匹配規則:
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
}
=====================================================
實例:
那么產生的效果如下:
訪問根目錄/, 比如http://localhost/ 將匹配規則A
訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H
訪問 http://localhost/static/a.html 將匹配規則C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則D和規則E,但是規則D順序優先,規則E不起作用,而 http://localhost/static/c.png 則優先匹配到 規則C
訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,因為規則E不區分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,因為不區分大小寫。規則F,規則G屬于排除法,符合匹配規則但是不會匹配到,所以想想看實際應用中哪里會用到。
訪問 http://localhost/category/id/1111 則最終匹配到規則H,因為以上規則都不匹配,這個時候應該是nginx轉發請求給后端應用服務器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理服務器存在。
=====================================================
實際應用配置:
直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。
這里是直接轉發給后端應用服務器了,也可以是一個靜態首頁
第一個必選規則
location = / {
proxy_pass http://tomcat:8080/index
}
第二個必選規則是處理靜態文件請求,這是nginx作為http服務器的強項
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* .(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
第三個規則就是通用規則,用來轉發動態請求到后端應用服務器
非靜態文件請求就默認是動態請求,自己根據實際把握
畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了
location / {
proxy_pass http://tomcat:8080/
}
=====================================================
全局變量:
官方配置:http://nginx.org/en/docs
query_string #同
arg_NAME #GET請求中NAME的值
uri #請求中的當前URI(不帶請求參數,參數位于
request_uri的值,它可以通過內部重定向,或者使用index指令進行修改,
document_uri #同
document_root #當前請求的文檔根目錄或別名
hostname #主機名
binary_remote_addr #客戶端地址的二進制形式,固定長度為4個字節
bytes_sent #傳輸給客戶端的字節數
connection_requests #TCP連接當前的請求數量
content_type #"Content-Type" 請求頭字段
limit_rate #用于設置響應的速度限制
nginx_version #nginx版本
pipe #如果請求來自管道通信,值為"p",否則為"."
realpath_root #當前請求的文檔根目錄或別名的真實路徑,會將所有符號連接轉換為真實路徑
remote_port #客戶端端口
request #代表客戶端的請求地址
request_body_file #將客戶端請求主體保存在臨時文件中。文件處理結束后,此文件需刪除。如果需要之一開啟此功能,需要設置client_body_in_file_only。如果將次文件傳遞給后端的代理服務器,需要禁用request body,即設置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
request_filename #當前連接請求的文件路徑,由root或alias指令與URI請求生成
request_method #HTTP請求方法,通常為"GET"或"POST"
request_uri #這個變量等于包含一些客戶端請求參數的原始URI,它無法修改,請查看
scheme #請求使用的Web協議,"http" 或 "https"
server_name #服務器名
server_protocol #服務器的HTTP版本,通常為 "HTTP/1.0" 或 "HTTP/1.1"
time_iso8601 #服務器時間的ISO 8610格式
cookie_NAME #客戶端請求Header頭中的cookie變量,前綴"
http_NAME #匹配任意請求頭字段;變量名中的后半部分NAME可以替換成任意請求頭字段,如在配置文件中需要獲取http請求頭:"Accept-Language",
http_cookie #cookie 信息
http_referer #引用地址
http_x_forwarded_for#相當于網絡訪問路徑。http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html
sent_http_content_length即可
sent_http_connection
sent_http_keep_alive
sent_http_location
$sent_http_transfer_encoding