在我的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语句的其他方法吗?
答案 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。如果没有,它会因错误而退出。