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 端口”的主要内容,如果未能解决你的问题,请参考以下文章

由于连接不安全,Okta 未重定向

Tomcat 未重定向到 400 bad request 自定义错误页面

Web 策略代理未重定向到 OpenAM URl

Grails Spring Security登录失败未重定向到登录视图

Traefik v2.5 未重定向到搬运工容器。 404 未找到

PayPal IPN 脚本未重定向到 ipn.php