美文网首页我用 LinuxLinux学习之路Linux
扣丁学堂红帽Linux开发Nginx实现IF语句AND和OR多重

扣丁学堂红帽Linux开发Nginx实现IF语句AND和OR多重

作者: 994d14631d16 | 来源:发表于2018-07-03 11:13 被阅读12次

      一、NginxRewrite规则相关指令有if、rewrite、set、return、break等

      1.其中rewrite是最关键的指令。一个简单的NginxRewrite规则语法如下:

      rewrite^/b/(.*)\.html/play.php?video=$1last;

      break;

      2.如果加上if语句,示例如下:

      if(!-f$request_filename)

      rewrite^/img/(.*)$/site/$host/images/$1last;

    ​  二、Nginx与Apache的Rewrite规则实例对比

      简单的Nginx和Apache重写规则区别不大,基本上能够完全兼容。例如:

      ApacheRewrite规则:

      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]

      NginxRewrite规则:

      rewrite^/(mianshi|xianjing)/$/zl/index.php?name=$1last;

      rewrite^/ceshi/$/zl/ceshi.phplast;

      rewrite^/(mianshi)_([a-zA-Z]+)/$/zl/index.php?name=$1_$2last;

      rewrite^/pingce([0-9]*)/$/zl/pingce.php?id=$1last;

      三、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"){

      return403;

      }

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

      set$flag0;

      if($remote_addr~"^(12.34|56.78)"){

      set$flag"${flag}1";

      }

      if($http_user_agent~*"spider"){

      set$flag"${flag}2";

      }

      if($flag="012"){

      return403;

      }

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

      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

    相关文章

      网友评论

        本文标题:扣丁学堂红帽Linux开发Nginx实现IF语句AND和OR多重

        本文链接:https://www.haomeiwen.com/subject/kueduftx.html