编程技术分享平台

网站首页 > 技术教程 正文

Nginx实现IF语句里的AND,OR多重判断

xnh888 2024-09-12 22:39:48 技术教程 31 ℃ 0 评论

一、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规则实例对比


简单的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;

}

这是等效的,并真实可用的配置

1

2

3

4

5

6

7

8

9

10

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)服务器真实生效的配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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/pythotab-access.log xingcheng;

error_log /tmp/pythotab-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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表