nginx使用记录

nginx反向代理获取用户真实ip

https://www.nginx.cn/4646.html

upstream www.redis.com.cn {
    ip_hash;
    server serving-server1.com:80;
    server serving-server2.com:80;
}
server {
    listen www.redis.com.cn:80;
    server_name www.redis.com.cn;

    location / {
        proxy_pass http://www.redis.com.cn;
    }

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

request_time and upstream_response_time

逻辑判断

概览

Nginx 中的 if/else 的语法与大多数语言一致:

if (<condition>) {
    # Do something
} else {
    # Do something
}

虽然 Nginx 并非编程语言,我们还是先来试试在其它语言中常用的手段吧。

但不支持逻辑运算和嵌套

if (<condition1> AND <condition2>) {
    # Do something
}


if (<condition1> && <condition2>) {
    # Do something
}

if (<condition1>) {
    if (<condition2>) {
        # Do something
    }
}

正确的姿势

“与”

set $foo "";
if (<condition1>) {
    set "${foo}1";
}
if (<condition2>) {
    set "${foo}1";
}
if ($foo ~* "11") {
    # Do something
}

首先把 $foo 清空,之后每当有一个条件成立,就会在 $foo 的结尾添加一个 1,当 $foo 中的字符串为“11”时,最后的代码块会被执行。

“或”

set $foo 0;
if (<condition1>) {
    set $foo 1;
}
if (<condition2>) {
    set $foo 1;
}
if ($foo = 1) {
    # Do something
}

只要两个条件中有任意一个成立,$foo 就会被赋值为 1,最后一个代码块就会被执行。

另外,如果“或”用在判断的变量的值时,可以用|更简单地解决:

if ($letter ~ ("A"|"B"|"C"|"D")) {
    # Do something
}

更多个条件组合

set $foo "";
if (<condition1>) {
    set $foo "1";
} else {
    set $foo "0";
}
if (<condition2>) {
    set $foo "${foo}1";
} else {
    set $foo "${foo}0";
}
if ( $foo ~* "011" ) {
    # Do something
}

开始时 $foo 是空字符串,每当一个判断成立时 $foo 的最后会被添加一个 1,不成立则添加 0,以此类推,最后一个 if 块中 $foo 要匹配的字符串就是你希望实现的判断。

Nginx 的变量字符匹配中,~*代表匹配,!~*代表不匹配(实际上都是正则)

参考

posted @ 2021-05-19 18:09  hiyang  阅读(104)  评论(0编辑  收藏  举报