Nginxのエラー「The plain HTTP request was sent to HTTPS port」の解決方法。
転載元 https://blog.yoodb.com/yoodb/article/detail/1527
Nginx HTTP
サーバーエラーの報告"
400 Bad Request: The plain HTTP request was sent to HTTPS port
"、この記事ではこの問題を解決する方法を説明します。単純にエラーの文字通りの意味からすると、HTTPリクエストがHTTPSポートに送られたためで、NginxがHTTPとHTTPSの両方のリクエストを処理する場合によくあることです。
以下は、Nginxの一般的なSSL設定です(セキュリティのため、当サイトのドメインを使用しています)。この設定ファイルでは、Nginxがポート80と443をリッスンし、すべてのHTTPリクエストをHTTPSにリダイレクトするようにします。
server {
listen 443;
server_name blog.yoodb.com;
charset UTF-8;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/blog/2539791_blog.yoodb.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/blog/2539791_blog.yoodb.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://172.17.6.114:8082;
proxy_pass ; }
location ~*/upload/images/ {
expires 1h;
root /mnt/app/project/files;
}
location ~*/dynamic/images/ {
expires 1h;
root /mnt/app/project/files;
}
}
上記の設定は問題ないように見えますが、例えばユーザーが http://blog.yoodb.com を使ってポート 80 のサイトにアクセスしようとリクエストすると、nginx 400 bad request in the browser" というエラーが表示されることになります。
The plain HTTP request was sent to HTTPS port
"、以下のような画像例となります。
Nginx がこのエラーを報告するのは、ユーザリクエストが HTTP でアクセスしようとするたびに HTTPS にリダイレクトされるため、Nginx は SSL を使ってやり取りすることを期待していますが、元のリクエスト(ポート 80 で受信)は通常の HTTP リクエストであり、エラーが発生するためです。
一方、ユーザーがhttps://blog.yoodb.com访问网站、上記のようなエラーに遭遇することはありません。また、他のサイトでSSLを使用しない設定にしている場合、NginxはHTTPSを使用しようとしますが、その場合も上記のエラーが発生します。
回避策
上記設定文中の "ssl on;" をコメントアウトまたは修正して "ssl off;" "listen 443;" を "listen 443 ssl" に修正して "listen 80" を追加して、Nginx がHTTPリクエストとHTTPSリクエストを両方処理できるように、次のように設定します。
server {
listen 80
listen 443 ssl;
server_name blog.yoodb.com;
charset UTF-8;
ssl_certificate /usr/local/nginx/conf/ssl/blog/2539791_blog.yoodb.com.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/blog/2539791_blog.yoodb.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://172.17.6.114:8082;
proxy_pass ; }
location ~*/upload/images/ {
expires 1h;
root /mnt/app/project/files;
}
location ~*/dynamic/images/ {
expires 1h;
root /mnt/app/project/files;
}
}
java redirect https to http問題、httpsでアクセスした場合nginxのproxy_passでhttpのtomcatサービスは正常にアクセスできるが、java redirectはhttpにジャンプし、エラー"が発生する。
400 Bad Request: The plain HTTP request was sent to HTTPS port
となります。
回避策
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://172.17.6.114:8082;
proxy_redirect http:// https://;
実装フローは、Location http to httpsを完了させるために、nginxの異なる実行フェーズをベースにしています。
1)
proxy_pass
実行前に、まずリクエストヘッドホストをhttpsに設定し、ドメイン+ポートに外部アクセスします。
2)
proxy_pass
実行後、tomcatのresultが応答を返します。
3)
proxy_redirect
レスポンス内のロケーションのプロトコル http をエクストラネットアクセス用の https に変更します。
注意:java リダイレクト リダイレクトは主に tomcat サービスのリクエストヘッドアイテムにアクセスすることで決定され、デフォルトは http プロトコル、ドメイン名はホストアドレスを読み取ることで決定され、デフォルトホストはアクセスポートを含んでいません。
関連
-
[解決済み】「設定ファイル/etc/nginx/nginx.confのテストに失敗しました」。この原因を知るにはどうしたらいいですか?
-
[解決済み] nginxのエラー "conflicting server name "を無視する [終了しました]。
-
[解決済み] どのヘッダテストツールでもnginxが400 bad request headersを投げるのを修正する方法は?
-
[解決済み] nginxリクエストで許容されるurlの長さを設定する方法 (エラーコード: 414, uri too large)
-
[解決済み] NGINXを設定して、サブルートで場所(同じサーバー名の下)に応じて異なるシングルページアプリケーション(SPA...すなわち静的ファイル)をデプロイする方法
-
[解決済み] バックグラウンドでリクエストするようにnginxを設定する
-
nginx スタートアップ・エラー。nginx.serviceのジョブは、制御プロセスがエラーコードで終了したため失敗しました。
-
OSError: [Errno 98] アドレスはすでに使用中です。
-
NginxのRequest Entity Too Largeの解決法
-
Nginx] エラー413 Request Entity Too Largeの解決方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Certbot /.well-known/acme-challenge
-
[解決済み] Nginx 無効なPID番号
-
Gitはいくつかのバグフィックスを行いました。マージされていないファイルがあるため、Pullができない。
-
nginxの問題解決:上流からの応答ヘッダーの読み込み中に上流が接続を早々に切断した
-
nginx が "414 request-uri too large" と表示される。
-
Nginx+tomcatでhttps化した後に400 Bad Requestが発生する問題
-
解決済み net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)
-
Nginxのエラー処理方法:0.0.0.0:80へのbind()に失敗する
-
チャンクベンダーが大きすぎるため、最初の画面の読み込みが遅すぎるフロントエンド・プロジェクトの最適化
-
Nginx設定ファイル(nginx.conf)の設定詳細