我们使用 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_name
rewrite
if
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 ...
}
...
}