如何让 NGINX 从 http 重定向到 https?

如何让 NGINX 从 http 重定向到 https?

我想在 NGINX 服务器块中从 http 重定向到 https。

下列的相关帖子中的答案我尝试在以下 NGINX 配置文件中添加另一个服务器块,但收到“服务器名称冲突”警告,因为(大概)的值server_name不包含协议前缀:

server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    server_name sub.domain.co.uk;
    return 302 https://sub.domain.co.uk$request_uri;
}

server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    server_name sub.domain.co.uk;
    location / {
        root /home/saves/webapps/html/;
        index index.html;
    }
    location /api/ {
        [...]
   }
}

答案1

问题是您已配置两个服务器块,它们在同一端口上侦听 SSL,且服务器名称相同,在这种情况下,nginx 无法决定选择哪一个。将其更改为:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    return 302 https://sub.domain.co.uk$request_uri;
}

server {
    listen 443;
    server_name sub.domain.co.uk;

    location / {
        root /home/saves/webapps/html/;
        index index.html;
    }
    location /api/ {
        [...]
   }
}

答案2

我考虑过这个问题,做了一些研究,并在主服务器块之前用一个更简单的服务器块解决了它,从这个答案

server {
    listen 80;                            
    location / {
        return 301 https://sub.domain.co.uk;
    }
}

但最终在看到以下评论后修改了它:

server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    server_name sub.domain.co.uk;
    location / {
        return 301 https://sub.domain.co.uk;
        root /home/saves/webapps/html/;
        index index.html;
    }
    [...]
}

因此感谢你们两位迅速而有用的回复。

相关内容