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

 

 

posted @ 2014-11-14 17:08  陳聽溪  阅读(6676)  评论(0编辑  收藏  举报