多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > nginx-location及rewrite

nginx-location及rewrite

來源:程序員人生   發布時間:2016-09-29 08:40:59 閱讀次數:3420次

location正則寫法


###### 1個示例: location = / { # 精確匹配 / ,主機名后面不能帶任何字符串 [ configuration A ] } location / { # 由于所有的地址都以 / 開頭,所以這條規則將匹配到所有要求 # 但是正則和最長字符串會優先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索 # 只有后面的正則表達式沒有匹配到時,這1條才會采取這1條 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索 # 只有后面的正則表達式沒有匹配到時,這1條才會采取這1條 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采取這1條。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 結尾的要求 # 但是,所有要求 /images/ 下的圖片會被 config D 處理,由于 ^~ 到達不了這1條正則 [ configuration E ] } location /images/ { # 字符匹配到 /images/,繼續往下,會發現 ^~ 存在 [ configuration F ] } location /images/abc { # 最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在 # F與G的放置順序是沒有關系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這1條正則,采取 [ configuration H ] } location ~* /js/.*/\.js
  • 已=開頭表示精確匹配
    如 A 中只匹配根目錄結尾的要求,后面不能帶任何字符串。
  • ^~ 開頭表示uri以某個常規字符串開頭,不是正則匹配
  • ~ 開頭表示辨別大小寫的正則匹配;
  • ~* 開頭表示不辨別大小寫的正則匹配

- / 通用匹配, 如果沒有其它匹配,任何要求都會匹配到

順序 no優先級:
(location =) > (location 完全路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部份起始路徑) > (/)

實際使用建議


所以實際使用中,個人覺得最少有3個匹配規則定義,以下: #直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。 #這里是直接轉發給后端利用服務器了,也能夠是1個靜態首頁 # 第1個必選規則 location = / { proxy_pass http://tomcat:8080/index } # 第2個必選規則是處理靜態文件要求,這是nginx作為http服務器的強項 # 有兩種配置模式,目錄匹配或后綴匹配,任選其1或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第3個規則就是通用規則,用來轉發動態要求到后端利用服務器 #非靜態文件要求就默許是動態要求,自己根據實際掌控 #畢竟目前的1些框架的流行,帶.php,.jsp后綴的情況很少了 location / { proxy_pass http://tomcat:8080/ }
http://tengine.taobao.org/book/chapter_02.html http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

Rewrite規則


rewrite功能就是,使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標志位實現url重寫和重定向。rewrite只能放在server{},location{},if{}中,并且只能對域名后邊的除去傳遞的參數外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只對/a/we/index.php重寫。語法rewrite regex replacement [flag];

如果相對域名或參數字符串起作用,可使用全局變量匹配,也能夠使用proxy_pass反向代理。

表明看rewrite和location功能有點像,都能實現跳轉,主要區分在于rewrite是在同1域名內更改獲得資源的路徑,而location是對1類路徑做控制訪問或反向代理,可以proxy_pass到其他機器。很多情況下rewrite也會寫在location里,它們的履行順序是:

  1. 履行server塊的rewrite指令
  2. 履行location匹配
  3. 履行選定的location中的rewrite指令
    如果其中某步URI被重寫,則重新循環履行1⑶,直到找到真實存在的文件;循環超過10次,則返回500 Internal Server Error毛病。

如果其中某步URI被重寫,則重新循環履行1⑶,直到找到真實存在的文件;循環超過10次,則返回500 Internal Server Error毛病。

flag標志位


  • last : 相當于Apache的[L]標記,表示完成rewrite
  • break : 停止履行當前虛擬主機的后續rewrite指令集
  • redirect : 返回302臨時重定向,地址欄會顯示跳轉后的地址
  • permanent : 返回301永久重定向,地址欄會顯示跳轉后的地址

由于301和302不能簡單的只返回狀態碼,還必須有重定向的URL,這就是return指令沒法返回301,302的緣由了。這里 last 和 break 區分有點難以理解:

  1. last1般寫在server和if中,而break1般使用在location中
  2. last不終止重寫后的url匹配,即新的url會再從server走1遍匹配流程,而break終止重寫后的匹配
  3. break和last都能組織繼續履行后面的rewrite指令

if指令與全局變量


if判斷指令
語法為if(condition){…},對給定的條件condition進行判斷。如果為真,大括號內的rewrite指令將被履行,if條件(conditon)可以是以下任何內容:

  • 當表達式只是1個變量時,如果值為空或任何以0開頭的字符串都會當作false
  • 直接比較變量和內容時,使用=或!=
  • ~正則表達式匹配,~*不辨別大小寫的匹配,!~辨別大小寫的不匹配

-f和!-f用來判斷是不是存在文件
-d和!-d用來判斷是不是存在目錄
-e和!-e用來判斷是不是存在文件或目錄
-x和!-x用來判斷文件是不是可履行

例如:

if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } //如果UA包括"MSIE",rewrite要求到/msid/目錄下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } //如果cookie匹配正則,設置變量$id等于正則援用部份 if ($request_method = POST) { return 405; } //如果提交方法為POST,則返回狀態405(Method not allowed)。return不能返回301,302 if ($slow) { limit_rate 10k; } //限速,$slow可以通過 set 指令設置 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果要求的文件名不存在,則反向代理到localhost 。這里的break也是停止rewrite檢查 if ($args ~ post=140){ rewrite ^ http://example.com/ permanent; } //如果query string中包括"post=140",永久重定向到example.com location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.com www.leizhenfang.com; if ($invalid_referer) { return 404; } //防盜鏈 }

全局變量
下面是可以用作if判斷的全局變量:

- $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 : 客戶端要求的動作,通常為GETPOST- $remote_addr : 客戶真個IP地址。 - $remote_port : 客戶真個端口。 - $remote_user : 已經過Auth Basic Module驗證的用戶名。 - $request_filename : 當前要求的文件路徑,由root或alias指令與URI要求生成。 - $schemeHTTP方法(如http,https)。 - $server_protocol : 要求使用的協議,通常是HTTP/1.0HTTP/1.1- $server_addr服務器地址,在完成1次系統調用后可以肯定這個值。 - $server_name服務器名稱。 - $server_port : 要求到達服務器的端口號。 - $request_uri : 包括要求參數的原始URI,不包括主機名,如:”/foo/bar.php?arg=baz”。 - $uri : 不帶要求參數確當前URI$uri不包括主機名,如”/foo/bar.html”。 - $document_uri : 與$uri相同。

例:http://localhost:88/test1/test2/test.php
hostlocalhostserver_port:88
$request_uri:http://localhost:88/test1/test2/test.php
documenturi/test1/test2/test.phpdocument_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php

經常使用正則


  • . : 匹配除換行符之外的任意字符
  • ?: 重復0次或1次
  • +: 重復1次或更屢次
  • *: 重復0次或更屢次
  • \d :匹配數字
  • ^ : 匹配字符串的開始
  • $ : 匹配字符串的介紹
  • {n} : 重復n次
  • {n,} : 重復n次或更屢次
  • [c] : 匹配單個字符c
  • [a-z] : 匹配a-z小寫字母的任意1個

小括號()之間匹配的內容,可以在后面通過12表示的是前面第2個()里的內容。正則里面容易讓人困惑的是\轉義特殊字符

rewrite實例


http { # 定義image日志格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 開啟重寫日志 rewrite_log on; server { root /home/www; location / { # 重寫規則信息 error_log logs/rewrite.log notice; # 注意這里要用‘’單引號引發來,避免{} rewrite '^/images/([a-z]{2})/([a-z0⑼]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面這條規則后面加上“last”參數,否則下面的set指令不會履行 set $image_file $3; set $image_type $4; } location /data { # 指定針對圖片的日志格式,來分析圖片類型和大小 access_log logs/images.log mian; root /data/images; # 利用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,如果還不在就跳轉到最后1個url里 try_files /$arg_file /image404.html; } location = /image404.html { # 圖片不存在返回特定的信息 return 404 "image not found\n"; } }

對形如/images/ef/uh7b3/test.png的要求,重寫到/data?file=test.png,因而匹配到location /data,先看/data/images/test.png文件存不存在,如果存在則正常響應,如果不存在則重寫tryfiles到新的image404 location,直接返回404狀態碼。

例2:

rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

對形如/images/bla_500x400.jpg的文件要求,重寫到/resizer/bla.jpg?width=500&height=400地址,并會繼續嘗試匹配location。

參考

http://www.nginx.cn/216.html
http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/
《老僧系列nginx之rewrite規則快速上手.pdf》
http://fantefei.blog.51cto.com/2229719/919431

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲精品久久一区毛片 | 国产精品自拍第一页 | 羞羞网址| 在线观看国产福利 | 91精品国产福利在线观看 | 欧美一区二区在线观看视频 | 欧美日韩一区二区三区视视频 | 宇都宫紫苑ed2k | v视界成人影院在线视频 | 国产噜噜噜视频在线观看 | 亚洲人成依人成综合网 | 亚洲人成伊人成综合网久久久 | 国产在线高清不卡免费播放 | 亚洲性综合网 | 一级a毛片免费观看 | 国产精品久久久久久久久夜色 | tube日本黑人杂交 | 国产女人精品性视频 | 三浦惠理子中文字幕在线一区二区 | 日本护士18一25 | 黄污网| 久久伊人亚洲 | 亚洲小说另类 | 亚洲成人高清在线 | 国产成人精品日本亚洲语言 | 国产成人精品久久综合 | www午夜视频| 中文字幕欧美日韩 | 日本护士xxxxx在线播放 | 欧美性猛交乱大交xxxx | 国产亚洲在线观看 | 亚洲精品高清国产麻豆专区 | 波多野结衣xxxx性精品 | 欧美高清一区 | 国产精品第二页 | 久草精品视频在线观看 | 国内在线观看精品免费视频 | 亚洲图片自拍偷拍 | 五月天伊人| 欧美精品一级毛片 | 久久久www免费看片 久久久www免费人成看片 |