是否可以在Nginx配置中将变量与重定向代码一起使用?

时间:2018-12-02 09:25:47

标签: nginx nginx-config

在我的Nginx配置中,我有这样的重定向规则:

map $uri $target {
    '/test123' 'https://www.somedomain.com/test456';
}
map $uri $target_code {
    '/test123' 301;
}
server {
    listen 80 default;

    if ($target_code = 301) {
        return 301 $target;
    }
    if ($target_code = 302) {
        return 302 $target;
    }
}

,效果很好。但是关于If is evil

我想要这样的陈述:

server {
    listen 80 default;

    return $target_code $target;
}

但是在重新启动期间,Nginx返回错误nginx: [emerg] invalid return code "$target_code" in /etc/nginx/nginx.conf

是否有可能以这种方式使用变量?或者也许是没有任何if语句的其他方法吗?

1 个答案:

答案 0 :(得分:0)

据我所知,这是 not possible。以下是代码的相关部分:

    ret->status = ngx_atoi(p, value[1].len);

    if (ret->status == (uintptr_t) NGX_ERROR) {

        if (cf->args->nelts == 2
            && (ngx_strncmp(p, "http://", sizeof("http://") - 1) == 0
                || ngx_strncmp(p, "https://", sizeof("https://") - 1) == 0
                || ngx_strncmp(p, "$scheme", sizeof("$scheme") - 1) == 0))
        {
            ret->status = NGX_HTTP_MOVED_TEMPORARILY;
            v = &value[1];

        } else {
            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                               "invalid return code \"%V\"", &value[1]);
            return NGX_CONF_ERROR;
        }

首先它尝试将第一个参数转换为整数。如果失败,它会检查它是否是一个 URL。如果没有,它会因错误而退出。