nginx通過set變量來實現if語句的AND判斷;


http://www.doself.com/?post=105

今天在配置一個網站的rewrite規則時碰到了這個問題。

在Nginx里不能夠采用這樣的語句

 

1 if ($request_method = POST && $http_cookie ~* "CCCC=.+(?:;|$)")

在Nginx里貌似if語句里也不能再嵌套if語句,怎么辦呢?

 

可以這樣

 

 

01 if ($request_method = POST) {
02     set $test  P;
03   }
04   
05   if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
06     set $test  "${test}C";
07   }
08   
09   if ($test = PC) {
10     #rewrite rule goes here.
11   }

ok,試試吧!

 

=========================

http://yooma.blog.51cto.com/6965726/1187067

 2、訪問某個php應用的時候我只想讓內部的某個IP訪問,其他的IP都轉到另一個PHP上。如下:
訪問test.php,且IP不等222.222.222.222的跳轉到55555.php:

  1. set $test '';
  2. if ( $request_uri ~* /img/test.php ) {
  3.         set $test P;
  4. }
  5. if ( $http_x_forwarded_for !~* ^222\.222\.222\.222.* ) {
  6.         set $test "${test}C";
  7. }
  8. if ( $test = PC ) {  #當條件符合 訪問test.php並且 ip不是222.222.222.222的 轉發到55555.php
  9. rewrite ^(.*)$ /img/55555.php permanent;  
  10. }

本文出自 “yooma技術博客” 博客,請務必保留此出處http://yooma.blog.51cto.com/6965726/1187067

 

http://i.cnblogs.com/EditArticles.aspx?opt=1

If    ($request_method    ~*   "POST")
                                {
                                               set    $test  o;
 
                                }
 
  
if    ($remote_addr      =     '188.188.3.171')        // 如果訪問地址等於188.188.3.171 則返回“k”
同理
#if  ($remote_addr    !=   '188.188.3.171')        // 如果訪問地址非 188.188.3.171 則返回 “k”
 
                                {
                                               Set    $test    "${test}k";
                                }
  // 如果滿足上述條件則返回“ok” 處理方式為返回403
  if    (  $test    =    ok  )
                                {
                                               Return    403;
                                                        #rewrite    ^(.*)    http://www.fengyuba.com  permanent;
                                                        # 如果滿足條件則重定向到 www.fengyuba.com
                                }
 
 
http://blog.jiajieit.net/nginx-achieve-if-multiple-judgments-wording/
 
寫Nginx.conf的朋友也會經常用到if判斷,這里的格式跟php里的有點不同。以下是多重if判斷的書寫格式方法。特意轉回來給路過的朋友看看,順便做個歸檔已備用日后參考。自己從中理解使用方法吧。有一點基礎的都應該看得懂的。

使用nginx的朋友可能都知道nginx的if語法比較嚴格,並且還沒and && || 這類寫法,如果你想多重判斷我們就只能想其它辦法了,下面我來給大介紹一種投機倒把另外想辦法實現多重判斷,方法介紹有需要了解的朋友可參考。

[code lang="xml" title="代碼片段一"]
if ($request_uri ~ "xxx.php?xxx") {
set $iftmp Y;
}
if ($http_user_agent ~ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)") {
set $iftmp "${iftmp}Y";
}
if ($iftmp = YY) { return 400;}
location / {
proxy_pass https://172.0.0.11;
}

重點一 set $iftmp Y 將iftmp設置為Y,set命令是一個大大的亮點

重點二 還是set部分set $iftmp "${iftmp}Y" 在set里面 ${iftmp}Y將參數疊加一次,${iftmp}是一個大大的亮點.

$request_uri是客戶端請求的完整請求路徑,$http_user_agent是用戶端發出請求的瀏覽器參數.
上面的if判斷是一個簡單防cc攻擊的原型,一般普通的cc攻擊會固定攻擊頁面,然后瀏覽器參數也大多不變,當前兩個if參數同時滿足后第三個if就直接返回給請求端400錯誤,
這樣就完成了一次簡單的過濾cc攻擊請求到正常頁面,根據上面的實例可以依葫蘆畫瓢進行其他一些應用使用.

假設我們需要對 /admin/ 路徑進行rewrite,但同時要排除 /admin/images/ 路徑不對該路徑進行rewrite,可以采用下面的解決辦法:

[code lang="xml" title="代碼片段二"]
set $doRewrite "0";
if ($request_uri ~ ^/admin/) {
set $doRewrite "1";
if ($request_uri ~ ^/admin/images/) {
set $doRewrite "0";
}
if ($doRewrite = "1") {
// do rewrite
}

本例子也有別的不用set變量的方法來實現。本文僅僅給大家提供一個思路,希望大家能拋磚引玉的應用到實際需求當中。

本文純屬轉載,本文轉自:http://www.111cn.net/sys/nginx/46311.htm

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM