关于如何将“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