You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完美配置Nginx处理HTTP/HTTPS并解决相关访问问题

Nginx配置问题修复方案

环境背景

  • Docker部署的Nginx,Dockerfile:
FROM nginx:alpine
RUN rm -rf /usr/share/nginx/html/
VOLUME /app
VOLUME /certbot
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
  • DNS记录:
www IN CNAME livreur.ovh.
IN A 83.115.211.248
  • 当前存在问题的Nginx配置:
server {
    listen 80;
    listen [::]:80;
    listen 443 default_server ssl;
    listen [::]:443 default_server ssl;

    ssl_certificate     /etc/letsencrypt/live/livreur.ovh/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/livreur.ovh/privkey.pem;
    
    server_name livreur.ovh www.livreur.ovh;

    if ($scheme != "https") {
        return 301 https://livreur.ovh$request_uri;
    }

    location ~ '/.well-known/acme-challenge' {
        root /var/www/certbot;
    }

    location / {
        root /app/dist/web/browser;
        try_files $uri $uri/ /index.html =404;
    }

}

问题1:http://livreur.ovh:443 返回400错误

错误信息:

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.27.3</center>
</body>
</html>

原因

443端口配置了ssl参数,仅接受HTTPS加密请求,但http://livreur.ovh:443是用明文HTTP协议访问该端口,Nginx无法处理这类请求,直接返回400错误。

修复方法

新增一个专门处理443端口明文HTTP请求的server块,同时调整原server块的监听规则:

  1. 添加处理443端口HTTP请求的server块:
server {
    listen 443;
    listen [::]:443;
    return 301 https://livreur.ovh$request_uri;
}
  1. 修改原server块,移除default_server标记(留到IP处理的server块中),确保只处理SSL请求:
server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate     /etc/letsencrypt/live/livreur.ovh/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/livreur.ovh/privkey.pem;
    
    server_name livreur.ovh www.livreur.ovh;

    # 80端口重定向到HTTPS
    if ($scheme != "https") {
        return 301 https://livreur.ovh$request_uri;
    }

    location ~ '/.well-known/acme-challenge' {
        root /var/www/certbot;
    }

    location / {
        root /app/dist/web/browser;
        try_files $uri $uri/ /index.html =404;
    }
}

问题2:阻止或重定向IP地址发起的HTTPS访问

方案1:直接拒绝IP访问(推荐)

添加一个默认server块,放在所有server块最前面,匹配未指定域名的请求(包括IP访问),直接关闭连接:

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_certificate     /etc/letsencrypt/live/livreur.ovh/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/livreur.ovh/privkey.pem;
    server_name _; # 匹配所有未指定的域名/IP
    return 444; # 无响应关闭连接
}

方案2:重定向IP访问到域名

如果希望引导用户到你的域名,可改用重定向:

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_certificate     /etc/letsencrypt/live/livreur.ovh/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/livreur.ovh/privkey.pem;
    server_name _;
    return 301 https://livreur.ovh$request_uri;
}

关于https://xxx:80无法连接的说明

https://83.115.211.248:80/和https://livreur.ovh:80/无法连接是正常现象:80端口是HTTP协议的默认端口,HTTPS协议默认使用443端口。用HTTPS协议访问80端口时,两端无法完成SSL握手,因此无法建立连接,该情况无需修复。


内容的提问来源于stack exchange,提问作者user22550242

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:12:08