【问题标题】:Nginx Redirect All Non-www Traffic to www on Ports 80 and 443Nginx 将所有非 www 流量重定向到端口 80 和 443 上的 www
【发布时间】:2021-01-20 08:24:02
【问题描述】:

我的 Nginx 服务器块当前配置为同时提供非 www 和 www 流量。如何将我的服务器块配置为:

http://example.com 应该转到:https://www.example.com

https://example.com 应该转到:https://www.example.com

这是我目前拥有的:

server {
    root /var/www/example.com;
    index index.html index.htm index.nginx-debian.html index.php;

    server_name example.com www.example.com;

    location / {
            try_files $uri $uri/ =404;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;
    return 404; # managed by Certbot
}

【问题讨论】:

  • 您的证书是否同时包含example.comwww.example.com 域名?
  • 是的,确实如此。两者都有效。

标签: http nginx https ssl-certificate


【解决方案1】:

将您的 SSL 服务器块一分为二:

server {
    server_name example.com;
    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    return 301 https://www.example.com$request_uri;
}
server {
    server_name www.example.com;
    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    root /var/www/example.com;
    index index.html index.htm index.nginx-debian.html index.php;
    location / {
            try_files $uri $uri/ =404;
    }
}

让监听 80 端口的服务器块保持原样。

【讨论】:

  • 我输入了 nginx -t 并得到: nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.com:14 nginx: 配置文件/etc/nginx/nginx.conf 测试失败
  • @GTSJoe 根据this 的回答和下面的cmets 你不应该使用ipv6only=on,只需要listen 443 ssl; listen [::]:443 ssl;
  • @GTSJoe 和here 是来自Michael Hampton 的一些关于certbot 的注释。我同意他关于 certbot 和它通常产生的丑陋配置的看法。
  • 太棒了!删除 ipv6only=on 后它现在可以工作了。感谢您的回答和来源链接。 ?
猜你喜欢
  • 2019-05-23
  • 2012-03-08
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多