尝试不在 NginX 中使用“if”,但是怎么做呢?

尝试不在 NginX 中使用“if”,但是怎么做呢?

我读过如果是邪恶的,不应该在 NginX 配置中使用。但是我该如何重写我的代码,以便不使用 if ?我想要做的是:如果有一个特殊请求“foobar.php”和一个名为“magicargument”的特殊参数,NginX 应该调用 Redis 而不是 php。当 redis 失败时,NginX proxy_passes 到 PHP。它可以工作,但只有当我使用 if 时!

这是配置

    location ~ foobar.php$ {
            default_type   application/json;
            error_page 404 = @redisfailed;

            if ($args = "")
            {
                     return 404;
            }

            if ($arg_magicargument = false)
            {
                    return 404;
            }

            set $redis_key $args;
            redis_pass     127.0.0.1:6379;
    }

    location @redisfailed
    {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
    }

答案1

如果您可以控制 redis 应用程序,您可以检查magicargument/那里的其他参数,并且location在 nginx 配置中仅使用一个简单的块而不需要if语句。

顺便说一句。您的location语句匹配以 结尾的每个 URL foobar.php,例如http://www.example.com/nonexistingdirectory/foobar.php。您可能希望更具体,例如location = /foobar.php仅处理foobar.php根 URI 中的请求。

相关内容