【问题标题】:How to redirect from http://www.* to https://* in Nginx?如何在 Nginx 中从 http://www.* 重定向到 https://*?
【发布时间】:2018-01-19 14:44:02
【问题描述】:

所以我正在努力实现 4 件事:

  • 同时支持 ip-v4 和 ip-v6
  • 支持letsencrypt ssl证书(http中的acme-challenge位置)
  • 将 www 重定向到非 www
  • 将 http 重定向到 https

我想出了一个配置,但它似乎不起作用。我在尝试访问 http://www.MY_DOMAIN.COM 时收到“页面不存在”。 由于 hsts 设置,在访问过 https 非 www 版本后,这确实有效。

请注意,我有带和不带 www 域的 ssl 证书。

我怎样才能做到这一点/我在我的配置中做错了什么:

# HTTP server
#
server {
    listen [::]:80;
    server_name MY_DOMAIN.COM www.MY_DOMAIN.COM;

    location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
        try_files $uri $uri/ =404;
    }

    location / {
        return 301 https://MY_DOMAIN.COM$request_uri;
    }
}
# HTTPS server
#
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.MY_DOMAIN.COM;

    ssl on;
    ssl_certificate         /etc/letsencrypt/live/www.MY_DOMAIN.COM/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/www.MY_DOMAIN.COM/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/www.MY_DOMAIN.COM/fullchain.pem;

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 5m;
    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    add_header Strict-Transport-Security "max-age=86400; includeSubDomains";

    return 301 https://MY_DOMAIN.COM$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server ipv6only=on;
    server_name MY_DOMAIN.COM;

    ssl on;
    ssl_certificate         /etc/letsencrypt/live/MY_DOMAIN.COM/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/MY_DOMAIN.COM/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/MY_DOMAIN.COM/fullchain.pem;

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 5m;
    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    add_header Strict-Transport-Security "max-age=86400; includeSubDomains";

    root /var/www/MY_DOMAIN.COM;
    index index.html;
}

另外,我觉得这两个服务器块的复制粘贴性质不太好。

【问题讨论】:

  • 您需要将 listen 80 添加到顶部的 server 块中,以便 IPv4 也可以监听。
  • @RichardSmith,你是对的。更改后,它按预期工作......这是一个转储错误。但是,现在没有答案可以接受...

标签: http redirect nginx https no-www


【解决方案1】:

正如@RichardSmith 所说;我没有在听http://www 变体的 ipv4 版本。因此,命令根本没有触发。

修复此问题后,设置工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 2014-05-08
    • 2018-02-02
    • 2020-10-01
    • 1970-01-01
    • 2016-01-07
    • 2017-09-03
    • 2016-04-27
    相关资源
    最近更新 更多