[nginx] nginx 400 “일반 HTTP 요청이 HTTPS 포트로 전송되었습니다”오류 처리

승객 / nginx 뒤에서 Sinatra 앱을 실행하고 있습니다. http 및 https 호출에 모두 응답하도록 노력하고 있습니다. 문제는 둘 다 서버 블록에 정의되어있을 때 https 호출이 정상적으로 응답되지만 http가 400 “일반 HTTP 요청이 HTTPS 포트로 전송되었습니다”오류를 생성한다는 것입니다. 이것은 정적 페이지 용이므로 Sinatra가 이것과 아무 관련이 없다고 생각합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

다음은 서버 블록입니다.

server {
        listen 80;
        listen 443  ssl;
        server_name localhost;
        root /home/myhome/app/public;
        passenger_enabled on;

        ssl on;
        ssl_certificate      /opt/nginx/ssl_keys/ssl.crt;
        ssl_certificate_key  /opt/nginx/ssl_keys/ssl.key;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          HIGH:!aNULL:!MD5;

        location /static {
            root  /home/myhome/app/public;
            index  index.html index.htm index.php;
        }

        error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 /500.html;

        access_log /home/myhome/app/logs/access.log;
        error_log /home/myhome/app/logs/error.log;
}



답변

비슷한 문제가 발생했습니다. 한 서버에서 작동하며 동일한 Nginx 구성을 가진 다른 서버에서는 작동하지 않습니다. 여기에서 Igor가 답변 한 솔루션을 찾았습니다. http://forum.nginx.org/read.php?2,1612,1627#msg-1627

예. 또는 SSL / 비 SSL 서버를 하나의 서버에 결합 할 수 있습니다.

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}


답변

연결 보안에 관계없이 http를 통해 페이지를 제공 할 수 있도록 ‘이 연결 HTTPS’테스트를 대부분 무시한다는 점에서 위의 답변은 올바르지 않습니다.

NGINX 특정 http 4xx 오류 코드의 오류 페이지를 사용하여 클라이언트가 https로 동일한 요청을 재 시도하도록 리디렉션하는 보안 답변입니다. (여기에 설명 된대로 /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )

OP는 다음을 사용해야합니다.

server {
  listen        12345;
  server_name   php.myadmin.com;

  root         /var/www/php;

  ssl           on;

  # If they come here using HTTP, bounce them to the correct scheme
  error_page 497 https://$host:$server_port$request_uri;

  [....]
}


답변

오류는 실제로 모든 것을 말합니다. 구성은 Nginx에 포트 80 (HTTP)에서 수신하고 SSL을 사용하도록 지시합니다. 브라우저를 http://localhost로 지정하면 HTTP를 통해 연결을 시도합니다. Nginx는 SSL을 예상하기 때문에 오류로 불평합니다.

해결 방법은 매우 간단합니다. 두 개의 server섹션 이 필요 합니다.

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}


답변

나는 똑같은 문제가 있었고 귀하의 예와 동일한 구성이 있으며 줄을 제거하여 작동하게했습니다.

ssl on;

문서를 인용하려면 :

HTTP 및 HTTPS 서버가 동일하면 “ssl on”지시문을 삭제하고 * : 443 포트에 대한 ssl 매개 변수를 추가하여 HTTP 및 HTTPS 요청을 모두 처리하는 단일 서버를 구성 할 수 있습니다.


답변

상태 코드 에 대한 위키피디아 기사에 따르면 . http 트래픽이 https 포트로 전송 될 때 Nginx에 사용자 지정 오류 코드가 있습니다 (오류 코드 497).

그리고 error_page의 nginx 문서에 따르면 특정 오류에 대해 표시 될 URI를 정의 할 수 있습니다.
따라서 오류 코드 497이 발생할 때 클라이언트가 전송 될 URI를 만들 수 있습니다.

nginx.conf

#lets assume your IP address is 89.89.89.89 and also
#that you want nginx to listen on port 7000 and your app is running on port 3000

server {
    listen 7000 ssl;

    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate_key.key;
    ssl_client_certificate /path/to/ssl_client_certificate.cer;

    error_page 497 301 =307 https://89.89.89.89:7000$request_uri;

    location / {
        proxy_pass http://89.89.89.89:3000/;

        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }
}

그러나 클라이언트가 GET을 제외한 다른 방법을 통해 요청하면 해당 요청은 GET으로 바뀝니다. 따라서 클라이언트가 들어온 요청 방법을 보존합니다. error_page의 nginx 문서에 표시된대로 오류 처리 리디렉션을 사용합니다.

이것이 우리가 301 =307리디렉션 을 사용하는 이유 입니다.

여기에 표시된 nginx.conf 파일을 사용하여 http 및 https가 동일한 포트에서 수신하도록 할 수 있습니다.


답변

다음은 ipv6을 지원하는 동일한 구성 블록에서 HTTPHTTPS 를 구성하는 예 입니다. 구성은 Ubuntu ServerNGINX / 1.4.6 에서 테스트 되었지만 모든 서버에서 작동합니다.

server {
    # support http and ipv6
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    # support https and ipv6
    listen 443 default_server ssl;
    listen [::]:443 ipv6only=on default_server ssl;

    # path to web directory
    root /path/to/example.com;
    index index.html index.htm;

    # domain or subdomain
    server_name example.com www.example.com;

    # ssl certificate
    ssl_certificate /path/to/certs/example_com-bundle.crt;
    ssl_certificate_key /path/to/certs/example_com.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;
}

오류 ssl on가 발생할 수있는 항목은 포함하지 마십시오 400. 위의 구성은

http://example.com

http://www.example.com

https://example.com

https://www.example.com

도움이 되었기를 바랍니다!


답변

phpmyadmin을 사용하는 경우 : fastcgi_param HTTPS on;