无付费SSL证书时Nginx将HTTPS重定向至HTTP的最优配置咨询
如何在反向代理场景下将HTTPS请求重定向至HTTP(无付费SSL证书)
我懂你的困扰——没有付费SSL证书,想把用户的HTTPS请求转去HTTP,但之前的配置都触发了ERR_SSL_PROTOCOL_ERROR。问题的核心出在SSL握手环节:当用户发起HTTPS请求时,浏览器会先和Nginx尝试建立SSL连接,如果Nginx在443端口没配置任何SSL证书相关设置,握手会直接失败,浏览器根本等不到重定向指令执行就报错了。
要解决这个问题,你需要先让Nginx能在443端口完成SSL握手(哪怕用免费的自签名证书),再执行重定向。下面是最简洁的可行方案:
步骤1:生成自签名SSL证书
先在服务器上生成一个免费的自签名证书(不需要付费CA机构认证),执行以下命令:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/yourdomain.key -out /etc/nginx/ssl/yourdomain.crt
执行时会提示填写一些域名、地区等信息,随便填写即可,重点是生成yourdomain.key(私钥)和yourdomain.crt(证书)两个文件。
步骤2:配置Nginx
替换成下面的Nginx配置:
# 处理HTTP请求,反向代理到你的Node.js服务 server { listen 80; server_name xxxx.com; location / { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8090; } } # 处理HTTPS请求,完成SSL握手后重定向到HTTP server { listen 443 ssl; server_name xxxx.com; # 指定刚才生成的自签名证书和私钥路径 ssl_certificate /etc/nginx/ssl/yourdomain.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; # 永久重定向所有HTTPS请求到HTTP return 301 http://$host$request_uri; }
为什么之前的配置失败?
- 第一种配置里
listen 443但没加ssl参数,也没配置证书,Nginx不会在这个端口处理SSL连接,浏览器发起HTTPS请求时无法完成握手,直接抛出协议错误。 - 第二种配置同样没给443服务器块配置SSL证书和
ssl参数,导致握手提前失败,重定向指令根本没机会执行。
注意事项
用户访问HTTPS时,浏览器会弹出“不安全连接”的警告(因为是自签名证书),但用户确认后会被正常重定向到HTTP。这是没有付费证书情况下的最优方案——毕竟HTTPS协议本身要求必须有证书才能建立连接。
内容的提问来源于stack exchange,提问作者ATX
相关产品推荐
相关产品推荐

