HTTP Nginx не перенаправляет на HTTPS 400 Неверный запрос «Простой HTTP-запрос был отправлен на порт HTTPS» - PullRequest
1 голос
/ 06 марта 2019

я запускаю nginx в докере.HTTPS работает нормально, но когда я явно отправляю HTTP-запрос, я получаю следующую ошибку

400 Bad Request Простой 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 Ответ

6 голосов
/ 06 марта 2019

Поместите следующую директиву в блок сервера, где вы прослушиваете порт 443.

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

Эта директива подразумевает, что, когда происходит «простой HTTP-запрос на порт HTTPS», перенаправьте его на https версию текущего имени хоста, порта и URI.

Вроде хак, но работает.

...