이 기사에서는 "를 해결하는 방법을 보여줍니다.400 잘못된 요청: 일반 HTTP 요청이 HTTPS 포트로 전송되었습니다." Nginx HTTP 서버에서. 이 오류는 일반적으로 HTTP 및 HTTPS 요청을 모두 처리하도록 Nginx를 구성하려고 할 때 발생합니다.
이 가이드의 목적을 위해 nginx가 다음을 통해 구현된 여러 웹사이트를 제공하는 시나리오를 고려하고 있습니다. 서버 블록 (또는 Apache의 가상 호스트) 한 웹사이트만 SSL을 사용하고 나머지는 사용하지 않습니다.
또한 읽기: Nginx의 보안, 강화 및 성능 향상을 위한 최고의 가이드
또한 nginx가 두 포트를 모두 수신하도록 지시하는 아래의 샘플 SSL 구성(보안상의 이유로 실제 도메인 이름을 변경함)을 고려할 것입니다. 80 그리고 443. 그리고 HTTP에 대한 모든 요청은 기본적으로 HTTPS로 리디렉션되어야 합니다.
서버{ 수신 80; server_name example.com www.example.com; 리턴 301 https://www.example.com$request_uri; } 서버 { 수신 443 SSL http2; server_name example.com www.example.com; 루트 /var/www/html/example.com/; 인덱스 index.php index.html index.htm; #charset koi8-r; access_log /var/log/nginx/example.com/example.com_access_log; error_log /var/log/nginx/example.com/example.com_error_log 오류; # SSL/TLS 구성 ssl on; SSL_인증서 /etc/ssl/certs/example_com_cert_chain.crt; ssl_certificate_key /etc/ssl/private/example_com.key; 포함 /etc/nginx/ssl.d/ssl.conf; 위치 / { try_files $uri $uri/ /index.php?$query_string; } error_page 500 502 503 504 /50x.html; 위치 = /50x.html { 루트 /var/www/html/example.com/; } # 127.0.0.1:80에서 수신하는 Apache에 PHP 스크립트를 프록시합니다. # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # PHP 스크립트를 127.0.0.1:9000에서 수신하는 FastCGI 서버에 전달합니다. # location ~ \.php$ { root /var/www/html/example.com/; fastcgi_pass 127.0.0.1:9001; #fastcgi_pass 유닉스:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_params 포함; 포함 /etc/nginx/fastcgi_params; } # Apache의 문서 루트가 nginx의 루트와 일치하는 경우 # .htaccess 파일에 대한 액세스를 거부합니다. # #location ~ /\.ht { # 모두 거부; #} }
위의 구성을 사용하여 클라이언트가 포트를 통해 사이트에 액세스하려고 하면 80 즉 http://example.com
, 문제의 오류는 다음 스크린샷과 같이 표시됩니다.
클라이언트가 HTTP를 통해 사이트에 액세스하려고 할 때마다 요청이 HTTPS로 리디렉션되기 때문에 이 오류가 발생합니다. nginx는 트랜잭션에 SSL이 사용될 것으로 예상하지만 원래 요청(포트 80을 통해 수신)은 일반 HTTP였기 때문에 오류가 발생했습니다.
반면 클라이언트가 사용하는 경우 https://example.com
, 위의 오류가 발생하지 않습니다. 또한 SSL을 사용하지 않도록 구성된 다른 웹사이트가 있는 경우 nginx는 기본적으로 HTTPS를 사용하려고 시도하여 위의 오류가 발생합니다.
이 오류를 수정하려면 구성에서 아래 줄을 주석 처리하거나 꺼짐으로 설정하십시오.
OR의 #ssl. SSL 끄기.
파일을 저장하고 닫습니다. 그런 다음 nginx 서비스를 다시 시작합니다.
# systemctl nginx를 다시 시작합니다. 또는. $ sudo systemctl nginx를 다시 시작합니다.
이런 식으로 nginx가 여러 서버 블록에 대한 HTTP 및 HTTPS 요청을 모두 처리하도록 할 수 있습니다.
마지막으로, 아래는 일반적인 Linux 배포판과 FreeBSD에서 SSL HTTPS를 설정하는 방법에 대한 기사 목록입니다.
지금은 여기까지입니다. 이 오류를 해결하는 다른 방법을 알고 있다면 아래 피드백 양식을 통해 알려주십시오.