Nginx 将 HTTP 重定向到 HTTPS,将 WWW 重定向到非 WWW

Car*_*ans 6 https redirect nginx web

我在使用此配置时遇到问题:

#=========================#
# 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;
        }
}
Run Code Online (Sandbox Code Playgroud)

第三个服务器指令有问题。我收到 SSL 连接错误。但是当我评论我们的那个部分时,一切正常。但我也希望 www 通过 https 重定向到非 www

任何人都可以发现问题吗?

nye*_*eke 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
}
Run Code Online (Sandbox Code Playgroud)

关于if is ill,请注意,使用if指令是安全的,因为它不在位置上下文中使用。


Car*_*ans 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;
Run Code Online (Sandbox Code Playgroud)

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