NGINX实现IF语句里的AND,OR多重判断
2017-08-06 18:14
381 查看
NGINX实现IF语句里的AND,OR多重判断
一、Nginx Rewrite规则相关指令有if、rewrite、set、return、break等
1.其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:
rewrite ^/b/(.*)\.html /play.php?video=$1 last;
break;
2.如果加上if语句,示例如下:
if (!-f $request_filename )
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
二、Nginx与Apache的Rewrite规则实例对比(此处参照https://yq.aliyun.com/articles/44957)
简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。例如:
Apache Rewrite 规则:
RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
RewriteRule ^/ceshi/$ /zl/ceshi.php [L]
RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]
Nginx Rewrite 规则:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
rewrite ^/ceshi/$ /zl/ceshi.php last;
rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;
rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;
三、NGINX实现IF语句里的AND,OR多重判断
1.nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现:
具体方法为AND 就用变量叠加,OR就用0或1切换。
1)首先是伪代码(即不被nginx支持),写在这里只是为了方便理解:
if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") {
return 403;
}
这是等效的,并真实可用的配置
set $flag 0;
if ($remote_addr ~ "^(12.34|56.78)") {
set $flag "${flag}1";
}
if ($http_user_agent ~* "spider") {
set $flag "${flag}2";
}
if ($flag = "012") {
return 403;
}
2)贴一段服务器真实生效的配置
location / {
if ( $request_filename ~ ^(.+)/(.+)$ ) {
set $l2 $1;
}
set $ll $request_filename;
if ( !-e $request_filename ) {
set $l3 "3";
}
if ( !-e $l2 ) {
set $l4 "1$l3";
}
if ( $l4 = 13) {
rewrite ^(.*)$ https://www.baidu.com;
}
access_log /tmp/51centos-access.log xingcheng;
error_log /tmp/51centos-error.log;
}
}
释义:
a.$request_filename 为被请求文件的路径,$request_filename ~ ^(.+)/(.+)$为被请求文件的上级目录信息。可以将$l2定义在日志格式中,通过日志查看输出是否成功。
b.通过 set $l4 "1$l3" ,实际上就代替了逻辑与运算。
四、nginx的rewrite规则参考:
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !~和!~*分别为区分大小写不匹配及不区分大小写不匹
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
- last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
- break 终止匹配, 不再匹配后面的规则
- redirect 返回302临时重定向 地址栏会显示跳转后的地址
- permanent 返回301永久重定向 地址栏会显示跳转后的地址
- $args
- $content_length
- $content_type
- $document_root
- $document_uri
- $host
- $http_user_agent
- $http_cookie
- $limit_rate
- $request_body_file
- $request_method
- $remote_addr
- $remote_port
- $remote_user
- $request_filename
- $request_uri
- $query_string
- $scheme
- $server_protocol
- $server_addr
- $server_name
- $server_port
- $uri
参考链接:
https://yq.aliyun.com/articles/44957 https://www.genban.org/teach/teach-15298.html http://blog.si a133
na.com.cn/s/blog_7303a1dc0101cm9z.html
一、Nginx Rewrite规则相关指令有if、rewrite、set、return、break等
1.其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:
rewrite ^/b/(.*)\.html /play.php?video=$1 last;
break;
2.如果加上if语句,示例如下:
if (!-f $request_filename )
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
二、Nginx与Apache的Rewrite规则实例对比(此处参照https://yq.aliyun.com/articles/44957)
简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。例如:
Apache Rewrite 规则:
RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
RewriteRule ^/ceshi/$ /zl/ceshi.php [L]
RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]
Nginx Rewrite 规则:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
rewrite ^/ceshi/$ /zl/ceshi.php last;
rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;
rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;
三、NGINX实现IF语句里的AND,OR多重判断
1.nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现:
具体方法为AND 就用变量叠加,OR就用0或1切换。
1)首先是伪代码(即不被nginx支持),写在这里只是为了方便理解:
if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") {
return 403;
}
这是等效的,并真实可用的配置
set $flag 0;
if ($remote_addr ~ "^(12.34|56.78)") {
set $flag "${flag}1";
}
if ($http_user_agent ~* "spider") {
set $flag "${flag}2";
}
if ($flag = "012") {
return 403;
}
2)贴一段服务器真实生效的配置
location / {
if ( $request_filename ~ ^(.+)/(.+)$ ) {
set $l2 $1;
}
set $ll $request_filename;
if ( !-e $request_filename ) {
set $l3 "3";
}
if ( !-e $l2 ) {
set $l4 "1$l3";
}
if ( $l4 = 13) {
rewrite ^(.*)$ https://www.baidu.com;
}
access_log /tmp/51centos-access.log xingcheng;
error_log /tmp/51centos-error.log;
}
}
释义:
a.$request_filename 为被请求文件的路径,$request_filename ~ ^(.+)/(.+)$为被请求文件的上级目录信息。可以将$l2定义在日志格式中,通过日志查看输出是否成功。
b.通过 set $l4 "1$l3" ,实际上就代替了逻辑与运算。
四、nginx的rewrite规则参考:
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !~和!~*分别为区分大小写不匹配及不区分大小写不匹
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
- last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
- break 终止匹配, 不再匹配后面的规则
- redirect 返回302临时重定向 地址栏会显示跳转后的地址
- permanent 返回301永久重定向 地址栏会显示跳转后的地址
- $args
- $content_length
- $content_type
- $document_root
- $document_uri
- $host
- $http_user_agent
- $http_cookie
- $limit_rate
- $request_body_file
- $request_method
- $remote_addr
- $remote_port
- $remote_user
- $request_filename
- $request_uri
- $query_string
- $scheme
- $server_protocol
- $server_addr
- $server_name
- $server_port
- $uri
参考链接:
https://yq.aliyun.com/articles/44957 https://www.genban.org/teach/teach-15298.html http://blog.si a133
na.com.cn/s/blog_7303a1dc0101cm9z.html
相关文章推荐
- NGINX实现IF语句里的AND,OR多重判断
- Nginx中IF、AND、OR语句用法实例
- smarty if判断语句中有多个条件时,可以用or和and
- SQL Server 学习(2)IF语句、多条件判断(CASE)、删除表中数据(Truncate)、AND 或是 OR 条件链接
- Nginx多重if判断的实现
- Mysql Select if 语句中实现的判断
- if 语句与and / or 用法扩展
- SQL语句技巧:查询时巧用OR实现逻辑判断
- if 判断两个数值大小--多分支if语句实现对参数的严格判断
- Nginx实现if多重判断配置方法示例
- 不使用乘除法,for,while,if,else,switch,case,条件判断语句(A?B:C) 实现:1+2+....+n
- Nginx if语句加正则表达式实现字符串截断
- MySQL 如何利用一条语句实现类似于if-else条件语句的判断
- Python 三元条件判断表达式(and or/if else)
- Java实现对MongoDB的AND、OR和IN操作 ,大于、小于等判断
- js算法一则:不用if。。while。。for等循环和判断语句实现1+2+3+...+n的和
- 编写一个计算某个月份的天数程序,请用if-else条件语句实现。要求根据用户输入的月份,判断出月份所包含的天数。
- Nginx中IF语句实现数学比较功能
- 实现1+2+3...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- Mysql Select if 语句中实现的判断