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:
- set $test '';
- if ( $request_uri ~* /img/test.php ) {
- set $test P;
- }
- if ( $http_x_forwarded_for !~* ^222\.222\.222\.222.* ) {
- set $test "${test}C";
- }
- if ( $test = PC ) { #当条件符合 访问test.php并且 ip不是222.222.222.222的 转发到55555.php
- rewrite ^(.*)$ /img/55555.php permanent;
- }
本文出自 “yooma技术博客” 博客,请务必保留此出处http://yooma.blog.51cto.com/6965726/1187067
http://i.cnblogs.com/EditArticles.aspx?opt=1
写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