Nginx如何将HTTP重定向到HTTPS以及WWW重定向到非WWW?

7

我在使用这个配置时遇到了问题:

#=========================#
# domain settings #
#=========================#

# Catch http://domain, and http://www.domain
server {
        listen 80;
        server_name www.domain domain;

        # Redirect to https://domain
        return 301 https://domain$request_uri;
}

# Catch https://www.domain
server {
        listen 443;
        server_name www.domain;

        # Redirect to https://domain
        return 301 https://domain$request_uri;
}

# Catch https://domain
server {
        listen 443;
        server_name domain;

        root /usr/share/nginx/domain;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;

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

第三个服务器指令存在问题,我遇到了SSL连接错误。当我将该部分注释掉后,一切都正常运行。但是我还想让www网址重定向到非www网址,并且使用https。

有人能发现问题所在吗?

2个回答

5
以下Nginx配置片段将使您有效地将所有http流量重定向到https,并剥离任何可能的www前缀。
因此,您的站点将严格可通过https访问,并且不包含www前缀。
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name www.example.com example.com;

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

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    if ($host = www.example.com) {
        return 301 https://example.com$request_uri;
    }

    server_name www.example.com example.com;

    # SSL configuration
    # Other configurations
}

参考if is evil,请注意在使用if指令时是安全的,因为它不是在location上下文中使用。


在这种设置中,如何处理https://www.example.com的https证书?我仍然在重定向到非www版本之前遇到证书错误。证书似乎只适用于非www,但无法在单独的服务器块上同时监听443端口的www和非www。 - Greggory Wiley
@GreggoryWiley TLS证书仅适用于443服务器块;它涵盖了www和非www,但仅提供非www服务。80服务器块接收www和非www的未加密流量;它将重定向到仅加密的非www。 - nyedidikeke

2

添加

ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;

在第三个服务器指令中解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接