ERR_SSL_PROTOCOL_ERRORが起こる原因は?「.htaccess」の書き方じゃなく、SSLの設定ミス
最近、ネットのセキュリティ強化のために、ホームページの「SSL化」の作業を行っています。
SSLの設定と、今までのホームページからのhttpsへの転送設定(リダイレクト)をしたら
ERR_SSL_PROTOCOL_ERROR
のエラーで、httpsのwww付きサイトが表示されなくなりました。
原因は、
wwwのサブドメインでSSLに対応ができてなかった
だったので、「www無しのSSL化」だけじゃなく、「wwwもSSL化」すれば解決しました。
httpsとhttp どちらも「wwwなしhttps」へリダイレクトする方法、.htaccessの書き方
ということで、
- http://www.net-syukyaku-jissen.club/(httpでwww付き)
- http://net-syukyaku-jissen.club/(httpでwww無し)
- https://www.net-syukyaku-jissen.club/(httpsでwww付き)
の3パターンを
- https://net-syukyaku-jissen.club/
にリダイレクトで統一する方法です。
今回は、「.htaccess」に書きました。
# BEGIN 自分
RewriteEngine on
RewriteBase /
# httpからの通信を、httpsにリダイレクト(www有り無し)
RewriteCond %{HTTPS} off
RewriteRule ^(.*$) https://net-syukyaku-jissen.club/$1 [R=301,L]
# httpsからの通信でwww有りの場合、www無しにリダイレクト
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www.net-syukyaku-jissen.club$
RewriteRule ^(.*)$ https://net-syukyaku-jissen.club/$1 [R=301,L]
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
httpsとhttp どちらも「wwwなしhttps」へリダイレクトする「.htaccess」の書き方解説
ワードプレスを使ってるので、後半の
# BEGIN WordPress
# “BEGIN WordPress” から “END WordPress” までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
RewriteEngine On
RewriteBase /RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
の周辺(正確には、「# BEGIN WordPress」と「# END WordPress」の間)に設定を書くと、ワードプレスによって上書きされてしまいますので、それより前に書きます。
設定の考え方として、まずは、
「httpでの接続を全部httpsにリダイレクト」
させ、その後
「www有りをwww無しにリダイレクト」
という流れです。
これだと、
「www有りをwww無しにリダイレクト」
してから、
「httpでの接続を全部httpsにリダイレクト」
にしても上手くいきそうなのですが、これだと、https://www.にいきなりアクセスされると
ERR_SSL_PROTOCOL_ERROR
になります。
というか、
そもそもwwwもSSL化しておかないと接続ポートが違うので、接続自体ができない
ってのが原因みたいです。
「.htaccess」の処理は、WEBサーバーにアクセスした後の処理なので、接続できてないと「.htaccess」自体処理できないってことですね。
ということで、
「httpでの接続を全部httpsにリダイレクト」
させ、その後
「www有りをwww無しにリダイレクト」
という設定にしました。
まず、
RewriteEngine on
は、リダイレクト設定を「on」にする部分です。
RewriteBase /
で、リダイレクトする内容を、htaccessを設置しているディレクトリじゃなく、ルートからのパスとして設定します。
で、
# httpからの通信を、httpsにリダイレクト(www有り無し)
RewriteCond %{HTTPS} off
RewriteRule ^(.*$) https://net-syukyaku-jissen.club/$1 [R=301,L]
という部分の「RewriteCond」で条件を決めます。
ここでは「httpsがoffだったら」ですね。
この条件に当てはまるアクセスがきたら
「RewriteRule」(リダイレクトのルール)で、httpsの接続へ転送してください
としています。
次に
# httpsからの通信でwww有りの場合、www無しにリダイレクト
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www.net-syukyaku-jissen.club$
RewriteRule ^(.*)$ https://net-syukyaku-jissen.club/$1 [R=301,L]
ですが、前の設定で、接続は全てSSLになってます。
なので、
「RewriteCond %{HTTPS} on」(httpsがon)
で、
「RewriteCond %{HTTP_HOST} ^www.net-syukyaku-jissen.club$」(www付きのアクセス)
だったら、
RewriteRule ^(.*)$ https://net-syukyaku-jissen.club/$1 [R=301,L](httpsでwww無し)
へ転送してください、となっています。
参考サイト)httpからhttpsにリダイレクト、www有無のリダイレクト方法(mod_rewrite)|レンタルサーバーナレッジ