Nginx HTTP 未重定向到 HTTPS 400 错误请求“普通 HTTP 请求已发送到 HTTPS 端口”

Posted

技术标签:

【中文标题】Nginx HTTP 未重定向到 HTTPS 400 错误请求“普通 HTTP 请求已发送到 HTTPS 端口”【英文标题】:Nginx HTTP not redirecting to HTTPS 400 Bad Request "The plain HTTP request was sent to HTTPS port" 【发布时间】:2019-07-28 09:11:16 【问题描述】:

我在 docker 中运行 nginx。 HTTPS 工作正常,但是当我明确发出 HTTP 请求时,我收到以下错误

400 错误请求 普通的 HTTP 请求被发送到 HTTPS 端口

nginx.conf如下

worker_processes auto ;          
events 

http 

include /etc/nginx/mime.types;

access_log /var/log/nginx/main.access.log;                                           

server     
listen 80;                                                                                                       
location / 
    return 301 https://localhost:3000$request_uri; 




server    
listen 443 ssl;                                                      
server_name  localhost:3000;                  
 root    /var/www/html; 

ssl_certificate         /etc/nginx/ssl/cert.pem; 
ssl_certificate_key     /etc/nginx/ssl/key.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

location / 
try_files  $uri /index.html;        





我使用

运行这个容器
docker run -p 3000:443 -it -d --name nginxtest nginx-test

并得到以下错误

docker文件如下

FROM nginx:latest
COPY ./build /var/www/html
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./ssl /etc/nginx/ssl
EXPOSE 443
CMD [ "nginx","-g","daemon off;" ]

奇怪的是,有时它工作得非常好,突然间它停止工作,如果我重新创建容器甚至都无法工作。

甚至尝试执行以下操作。还是没有运气

 server     
    listen 80;                                                                                                       
     server_name localhost:3000
        return 301 https://localhost:3000$request_uri; 
    

当我运行以下 docker 命令时,另一件奇怪的事情

docker run -p 3000:443 -p 3001:80 -it -d --name nginxtest nginx-test

然后转到 localhost:3001 它会将我重定向到 https 就好了,但其他事情确实会中断。 抱歉问了这么长的问题

【问题讨论】:

【参考方案1】:

将以下指令放入您侦听端口 443 的服务器块。

error_page 497 https://$host:$server_port$request_uri;

该指令意味着当“普通 HTTP 请求被发送到 HTTPS 端口”发生时,将其重定向到当前主机名、端口和 URI 的 https 版本。

有点 hacky 但可以工作。

【讨论】:

这确实有效!非常感谢。但是你能详细说明一下为什么会这样吗?我在导致这种行为的配置中做错了什么吗?有什么正确的做法吗?哈克确实像魅力一样工作。节省了一天。多一点洞察力会有所帮助 发生这种情况是因为您为 https 协议使用了非标准端口。 (这完全没问题。)在典型的 https 设置中,您通过端口 443 提供 https。当使用 https:// 前缀访问该设置时,您不会将 :443 放入地址栏,浏览器会自动添加它以发出请求。 (对于 http:// 它增加了 80)。但是,当您从非标准端口提供 https 内容时,您可以尝试访问 http://example.com:3000,其中 nginx 需要 https 请求。这意味着“普通的 HTTP 请求已发送到 HTTPS 端口”:)。 这完全有道理。非常感谢。拯救了我的一天。干杯:D 为我工作!谢谢

以上是关于Nginx HTTP 未重定向到 HTTPS 400 错误请求“普通 HTTP 请求已发送到 HTTPS 端口”的主要内容,如果未能解决你的问题,请参考以下文章