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

Oma*_*iel 4 nginx docker nginx-reverse-proxy nginx-config

我正在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;        
}

}

}
Run Code Online (Sandbox Code Playgroud)

我使用这个容器运行

docker run -p 3000:443 -it -d --name nginxtest nginx-test
Run Code Online (Sandbox Code Playgroud)

并得到以下错误

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;" ]
Run Code Online (Sandbox Code Playgroud)

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

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

 server {    
    listen 80;                                                                                                       
     server_name localhost:3000
        return 301 https://localhost:3000$request_uri; 
    }
Run Code Online (Sandbox Code Playgroud)

当我运行以下docker命令时的另一件事

docker run -p 3000:443 -p 3001:80 -it -d --name nginxtest nginx-test
Run Code Online (Sandbox Code Playgroud)

并转到localhost:3001,它将我重定向到https很好,但其他事情确实中断了。很抱歉这个长问题

Yar*_*dam 10

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

error_page 497 https://$host:$server_port$request_uri;
Run Code Online (Sandbox Code Playgroud)

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

Kinda hacky但可以。

  • 发生这种情况是因为您使用 https 协议的非标准端口。(这完全没问题。)在典型的 https 设置中,您通过端口 443 提供 https 服务。当使用 https:// 前缀访问该设置时,您不会将 :443 添加到地址栏,浏览器会自动添加它放置请求。(对于 http://,它会增加 80)。但是,当您从非标准端口提供 https 内容时,您可以尝试访问 http:// example.com:3000,其中 nginx 需要 https 请求。这意味着“纯 HTTP 请求已发送到 HTTPS 端口”:)。 (3认同)