人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

nginx location中多個(gè)if里面proxy_pass的方法

發(fā)布日期:2022-01-08 16:33 | 文章來源:站長(zhǎng)之家

1、首先我們回顧一下nginx中l(wèi)ocation的相關(guān)知識(shí)

1)location的匹配指令:

  • ~ #波浪線表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫
  • ~* #表示執(zhí)行一個(gè)正則匹配,不區(qū)分大小寫
  • ^~ #^~表示普通字符匹配,不是正則匹配。如果該選項(xiàng)匹配,只匹配該選項(xiàng),不匹配別的選項(xiàng),一般用來匹配目錄
  • = #進(jìn)行普通字符精確匹配
  • @ #"@" 定義一個(gè)命名的 location,使用在內(nèi)部定向時(shí),例如 error_page, try_files

2)location 匹配的優(yōu)先級(jí)(與location在配置文件中的順序無關(guān))

1.= 精確匹配會(huì)第一個(gè)被處理。如果發(fā)現(xiàn)精確匹配,nginx停止搜索其他匹配。
2.普通字符匹配,正則表達(dá)式規(guī)則和長(zhǎng)的塊規(guī)則將被優(yōu)先和查詢匹配,也就是說如果該項(xiàng)匹配還需去看有沒有正則表達(dá)式匹配和更長(zhǎng)的匹配。
3.^~ 則只匹配該規(guī)則,nginx停止搜索其他匹配,否則nginx會(huì)繼續(xù)處理其他location指令。
4.最后匹配理帶有"~"和"~*"的指令,如果找到相應(yīng)的匹配,則nginx停止搜索其他匹配;當(dāng)沒有正則表達(dá)式或者沒有正則表達(dá)式被匹配的情況下,那么匹配程度最高的逐字匹配指令會(huì)被使用。

2、nginx多個(gè)if里面proxy_pass:

server {
listen 127.0.0.1:80;
    set $test A; 
  
    set $testB B;
    location / {
      if ($test ~* "A") { 
         proxy_pass http://www.so.com; 
         break; 
      } 
      if ($testB ~* "B") { 
         proxy_pass http://www.sogou.com; 
         #break; 
      } 
    }
}

希望滿足某個(gè)條件的時(shí)候,走某個(gè)proxy_pass。但是如果多個(gè)if都滿足,比如上例中的情況:在第一個(gè)if中沒有break的時(shí)候,就會(huì)執(zhí)行下面的;為了第一個(gè)匹配上之后就執(zhí)行proxy_pass,可以加上break。(在nginx中貌似沒有if else這樣的指令)

3、判斷參數(shù)進(jìn)行不同的proxy_pass:

rewrite只能通過url路徑進(jìn)行匹配,不能進(jìn)行參數(shù)匹配,所以如果要實(shí)現(xiàn)參數(shù)的判斷需要用$arg_parameter。

location / {
    root  html;
    index  index.html index.htm index.php;
    proxy_redirect   off;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header  Connection "";
    if ( $query_string ~* "usg=0" ) {
      proxy_pass   http://local_workera;
    }
    if ( $query_string ~* "usg=1" ) {
      proxy_pass   http://local_workerb;
    }
    if ( $arg_uid ~* "(.*[AB]$)" ) {
  proxy_pass   http://local_workerf;
    }
    proxy_pass  http://local_workera;
}

1)請(qǐng)求路徑中的usg=0和usg=1這兩個(gè)參數(shù)是確定的,所以使用了$query_string進(jìn)行正則匹配即可;($query_string的值是請(qǐng)求中所有參數(shù))

2)接下來,我們想對(duì)uid的值如果是以A、B結(jié)尾的請(qǐng)求,轉(zhuǎn)向local_workerf處理,這時(shí)候就無法用$query_string進(jìn)行正則匹配了;(因?yàn)閷?duì)于/?uid=1A&t=1&usg=1和/?uid=123&t=A&usg=0 不太好匹配)這時(shí),只能用$arg_uid進(jìn)行正則匹配了。

3)由于usg=0和usg=2這兩個(gè)參數(shù)是互斥的,所以根據(jù)上面location中if指令的邏輯,不用break也可以正確處理,且放到最上面。對(duì)于uid的匹配,由于會(huì)和usg進(jìn)行沖突,所以只能放到最下面或者加break,即:

location / {
    root  html;
    index  index.html index.htm index.php;
    proxy_redirect   off;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header  Connection "";
 
 if ( $arg_uid ~* "(.*[AB]$)" ) {
  proxy_pass   http://local_workerf;
  break;
    }
    if ( $query_string ~* "usg=0" ) {
      proxy_pass   http://local_workera;
    }
    if ( $query_string ~* "usg=1" ) {
      proxy_pass   http://local_workerb;
    }
    proxy_pass  http://local_workera;
}

到此這篇關(guān)于nginx location中多個(gè)if里面proxy_pass的方法的文章就介紹到這了,更多相關(guān)nginx location proxy_pass內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部