是否可以在Nginx配置中使用带有重定向代码的变量



在我的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;
}
}

而且效果很好。但关于如果是邪恶的

我想发表这样的声明:

server {
listen 80 default;
return $target_code $target;
}

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

有可能以这种方式使用变量吗?或者,也许是另一种方法,使它没有任何if语句?

从我所看到的情况来看,这是不可能的。以下是代码的相关部分:

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。如果没有,它就会抛出错误。

最新更新