"プレーンHTTPリクエストがHTTPSポートに送信された"を修正しました。 Nginxのエラー


この記事では、Nginx HTTPサーバーの「 400不正なリクエスト:プレーンなHTTPリクエストがHTTPSポートに送信された」という問題を解決する方法を説明します。このエラーは通常、HTTPとHTTPSの両方の要求を処理するようにNginxを設定しようとしたときに発生します。

このガイドでは、nginxがサーバーブロック(またはApacheの仮想ホスト)を介して実装された複数のWebサイトにSSLを使用し、残りはSSLを使用しないというシナリオを検討しています。

下記のSSL設定例(セキュリティ上の理由から実際のドメイン名を変更しました)も検討します。これはnginxにポート 80 443 の両方をリッスンするように伝えます。そしてHTTP上のすべてのリクエストはデフォルトでHTTPSにリダイレクトされるべきです。

server{
        listen 80;
        server_name example.com www.example.com;
        return 301 https://www.example.com$request_uri;
}
server {
        listen 443 ssl http2;
        server_name example.com www.example.com;

        root   /var/www/html/example.com/;
        index 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   error;

        # SSL/TLS configs
        ssl on;
        ssl_certificate /etc/ssl/certs/example_com_cert_chain.crt;
        ssl_certificate_key /etc/ssl/private/example_com.key;

        include /etc/nginx/ssl.d/ssl.conf;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/html/example.com/;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {

                root   /var/www/html/example.com/;
                fastcgi_pass   127.0.0.1:9001;
                #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

上記の設定を使用して、クライアントがポート 80 、つまり http://example.com を介してサイトにアクセスしようとすると、問題のエラーが次のように表示されます。スクリーンショット

このエラーが発生するのは、顧客がHTTP経由でサイトにアクセスしようとするたびに、リクエストがHTTPSにリダイレクトされるためです。これは、nginxがトランザクションでSSLが使用されることを期待していても、元のリクエスト(ポート80を介して受信された)がプレーンHTTPであったためです。

一方、クライアントが https://example.com を使用している場合は、上記のエラーは発生しません。さらに、SSLを使用しないように設定されている他のWebサイトがある場合、nginxはデフォルトでHTTPSを使用しようとしますが、上記のエラーが発生します。

このエラーを修正するには、設定の下の行をコメントアウトするか、またはoffに設定します。

#ssl on 
OR
ssl off

ファイルを保存して閉じます。その後、nginxサービスを再起動します。

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

これにより、nginxが複数のサーバーブロックに対するHTTP要求とHTTPS要求の両方を処理できるようになります。

最後に、一般的なLinuxディストリビューションとFreeBSDでSSL HTTPSをセットアップすることに関する記事のリストを以下に示します。

  1. Setting Up HTTPS with Let’s Encrypt SSL Certificate For Nginx on RHEL/CentOS
  2. Secure Nginx with Free Let’s Encrypt SSL Certificate on Ubuntu and Debian
  3. How to Secure Nginx with SSL and Let’s Encrypt in FreeBSD

それは今のところすべてです。あなたがこのエラーを解決するための他の方法を知っているならば、以下のフィードバックフォームを通して私たちに知らせてください。