在具有其他主机名的虚拟主机中可以存在“返回”重写吗?

在具有其他主机名的虚拟主机中可以存在“返回”重写吗?

我们使用 Nginx 作为反向代理,将流量传递到我们的基础设施中,该基础设施在内部响应foo.com*.foo.com主机标头。我们配置了一个 http 服务器,它的唯一任务是将这些重定向到 https 服务器,但也积累了其他规则,例如*.www.foo.com和,www.*.foo.com这些规则被重写以删除www.。[老年人认为www 必须每一个网址某处] 它的配置块看起来像这样:

server {
    listen 80;
    server_name
        ~^([\w-]+\.)?foo\.com$
        ~^([\w-]+\.)?www\.foo\.com$
        ~^www\.([\w+-]\.)?foo\.com$
    return 301 https://$1foo.com$request_uri;
}

但是,为了适应即将到来的“仅 HTTPS”世界,我也需要在 https 服务器块中添加非标准主机名的重写。我希望重写和非重写配置可以存在于同一个块中,以保持配置简洁。

我尝试了以下配置,但它没有发出重定向并且将错误的 www.bar.foo.com 主机标头传递到后端应用程序。

server {
    listen 443;
    server_name ~^www\.([\w-]+\.)?foo\.com$;
    return 301 https://$1foo.com$request_uri;

    server_name foo.com *.foo.com;
    location ... {
        proxy_pass ...
    }
    ...
}

它还会生成以下警告,我觉得很奇怪:

nginx: [warn] server name "https://$1foo.com$request_uri" has suspicious symbols

答案1

似乎我遗漏了(除了分号)的是if重写模块的指令。是一种适合遵循规范[以及我确信的其他事物]return的钝器,适合重写 URI 的路径部分,但要雕刻出已经被通配符覆盖的主机名的特定正则表达式,则需要使用如下所示的语句。server_namerewriteif

server {
    listen 443;
    server_name foo.com *.foo.com;

    if ( $host ~ ^www\.([\w-]+\.)?foo\.com$ ) {
        return 301 https://$1foo.com$request_uri;
    }

    location ... {
        proxy_pass ...
    }
    ...
}

相关内容