Nginx - 如何强制所有服务器域和服务器块使用非 www 重定向?

Nginx - 如何强制所有服务器域和服务器块使用非 www 重定向?

关于如何将“www”重定向到“非 www”以及反之亦然,有很多好的结果。

最多推荐的解决方案是这个

server {
    listen 80;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

对于单个网站配置文件,这种方法效果很好。但是,当您在一个 Nginx 服务器下有多个网站时,这种方法很快就会造成配置重复。

我真的很想避免在我正在处理的服务上重复配置......

因此,我假设的捕获所有 www.[anything.com] 域名的解决方案如下所示:

server {
    listen 80;
    return 301 https://$host$request_uri;
}

不过,我相信该$host变量里面仍然包含“www”(这是有道理的)。

我正在努力用我当前的配置来测试这一点,因此为了节省时间,请问有更多 Nginx 经验的人能否为我指明正确的方向?

感谢您的时间!

答案1

您可以使用以下方法:

server {
    listen 80;
    server_name ~^(?:www\.)(.*)$;

    return 301 https://$1$request_uri;
}

www.正则表达式捕获变量之后的部分$1,然后在语句中使用该部分return

https://nginx.org/r/服务器名称更详细地解释了 nginx 如何决定server使用哪个块。

答案2

server { 

         server_name example.com; 

         return 301 https://www.example.com$request_uri; 

}

默认情况下,如果省略此指令,nginx 会假定您想要监听端口 80。

这是文档此默认行为。

这是 default-ssl.conf 的完整配置

server {

 listen 443 ssl;

 server_name example.com; 

ssl_certificate /srv/www/example.com/keys/ssl.crt; 

ssl_certificate_key /srv/www/example.com/keys/www.example.com.key; 

return 301 https://www.example.com$request_uri; 

}

您可以按照以下建议将 ssl on; 指令替换为 listen 443 ssl;nginx 文档。

答案3

欢迎来到 ServerFault。

虽然 Tero Kilkanen 回答的是核心概念,但更美好官方文档中已经提供了同样的方法https://nginx.org/r/服务器名称以及https://nginx.org/en/docs/http/server_names.html

server {
    server_name ~^www\.(?<baredomain>.+)$;
    return 301 https://$baredomain$request_uri;
}

这在评估正则表达式时使用了一种称为“命名捕获”的方法。“命名捕获”可以使用以下任何一种语法...

?<name> Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
?P<name>    Python compatible syntax, supported since PCRE-4.0

相关内容