相关推荐recommended
nginx if 指令
作者:mmseoamin日期:2024-04-27

目录

  • nginx if 指令
  • 直接判断变量
  • 判断是否等于字符串
  • 判断变量是否匹配正则表达式
  • 文件及目录判断
  • 示例1:判断index.html是否存在
  • 示例2:判断URL中是否存在某个参数Parameter
  • 示例3:判断URI中是否为某个特定路径
  • 示例4:开放白名单内的功能,其余功能禁止访问
  • 示例5:if-else
  • 示例6:多重if判断
  • 参考

    nginx if 指令

    参考这里

    Syntax:	if (condition) { ... }
    Default:	—
    Context:	server, location
    

    直接判断变量

    • 如果变量值是空字符串或者"0"时,判定为false;否则,判定为true。
    • 1.0.1版本前,任何以"0"开头的字符串,判定为false。
      if ($slow) {
          limit_rate 10k;
      }
      if ($invalid_referer) {
          return 403;
      }
      

      判断是否等于字符串

      使用 “=” 和 “!=” 操作符判断是否等于字符串

      if ($request_method = POST) {
          return 405;
      }
      

      判断变量是否匹配正则表达式

      使用 “~” 和 “!~” 操作符判断变量是否匹配正则表达式。

      • ~:判断时区分字符大小写
      • ~*:判断时不区分字符大小写
      • !~:判断时区分字符大小写
      • !~*:判断时不区分字符大小写
        if ($http_user_agent ~ MSIE) {
            rewrite ^(.*)$ /msie/ break;
        }
        if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
            set $id ;
        }
        

        文件及目录判断

        • “-f”, “!-f”:判断指定的路径是否为存在且为文件;
        • “-d”, “!-d”:判断指定的路径是否为存在且为目录;
        • “-e”, “!-e”:判断指定的路径是否存在,文件或目录均可;
        • “-x”, “!-x”:判断指定路径的文件是否存在且可执行;

          示例1:判断index.html是否存在

          location =/index.html {
          	if (!-f "$document_root/index.html") {
          	    rewrite ^(.*)$  /index2.html;
          	}
          }
          

          示例2:判断URL中是否存在某个参数Parameter

          if ($query_string ~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { 
          	...
          }
          

          示例3:判断URI中是否为某个特定路径

          if ($request_uri ~* "^/app/stat/"){
              ...
          }
          

          示例4:开放白名单内的功能,其余功能禁止访问

          # 白名单开关。false,打开;true,关闭。
          set $isInWhiteList 'false';
          # 白名单1:统计
          if ($request_uri ~* "^/app/stat/"){
              set $isInWhiteList  'true';
          }
          # 白名单2:ajax接口
          if ($request_uri ~* "^/app/ajax/"){
              set $isInWhiteList 'true';
          }
          # 采用白名单方式放行功能
          location /app {
              if ($isInWhiteList != 'true') {
                  rewrite ^/ /deny;
              }
              proxy_pass  http://127.0.0.1:8080;
          }
          # 禁止访问
          location =/deny {
              deny all;  
          }
          

          示例5:if-else

          # 条件:if
          if ($request_uri ~* "abc"){
          	set $flag '${flag}1';
          }
          # 条件:else
          if ($request_uri !~* "abc"){
          	set $flag '${flag}2';
          }
          

          示例6:多重if判断

          server {
          	...
          	
          	set $flag "";
          	
          	# 条件1:if
          	if ($request_uri ~* "abc"){
          		set $flag '${flag}1';
          	}
          	# 条件1:else
          	if ($request_uri !~* "abc"){
          		set $flag '${flag}2';
          	}
          	
          	# 条件2:if
          	if ($query_string ~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { 
          		set $flag '${flag}1';
          	}
          	# 条件2:else
          	if ($query_string !~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { 
          		set $flag '${flag}2';
          	}
          	
          	# 多重if完了,根据结果做相应处理
          	if ($flag = '11') {
          		...
          	}
          	if ($flag = '12') {
          		...
          	}
          	if ($flag = '21') {
          		...
          	}
          	if ($flag = '22') {
          		...
          	}
          	
          	location / {
          		...
          	}
          }
          

          参考

          https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

          Nginx的多重if判断