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 端口”的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat 未重定向到 400 bad request 自定义错误页面
Grails Spring Security登录失败未重定向到登录视图