欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Ngixn运维之七 if、set、return

程序员文章站 2022-03-04 13:01:39
...

set

Syntax: set $variable value;
Default: —
Context: server, location, if

set可以为变量设置值,值可以为字符串/变量以及它们的组合。

例如:

set $s1 1;
set $s2 "${s1}1"

return

Syntax: return code [text]; return code URL; return URL;
Default: —
Context: server, location, if

停止处理并且返回响应码给客户端,非标准代码444会在不发送响应头的情况下关闭连接。

从 0.8.42版本开始, 支持为状态码(for codes 301, 302, 303, 307, and 308)跳转URL为其他的状态码返回返回体数据。返回体或者跳转的URL支持包含变量。特殊情况,重定向URL可以指定为该服务器的本地URI,在这种情况下,完整的跳转URL依据请求 scheme ($scheme) 和the server_name_in_redirect and port_in_redirect 指令。

例如:
请求重定向到一个新域名

location = /test {
		return 301 $scheme://www.example.com$request_uri;
       	}

请求直接返回数据

        location ^~ /getIP {
            default_type text/html;
            return 200 '[$remote_addr]';
        }

if

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

对特定的条件进行判断,如果为true,括号内将会被执行。

正则表达式匹配:

  • =:等值比较;
  • ~:区分大小写的正则表达式模式匹配
  • ~*:不区分大小写的正则表达式模式匹配
  • !~:区分大小写的正则表达式模式不匹配
  • !~*:不区分大小写的正则表达式模式不匹配

文件及目录匹配判断:

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

例如:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

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

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

AND,OR多重判断

nginx的配置中不支持if条件的&& ||运算 ,并且不支持if的嵌套语法,但是我们可以用变量的方式来实现:

具体方法为AND 就用变量叠加,OR就用0或1切换。

例如我们的目标(伪代码):

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;
}
相关标签: Nginx