SSL化で.htaccessにhttpからhttpsへリダイレクト設定してもうまくいかない、500エラー時に確認すること

昔に比べてSSLの導入は敷居が低くなったと思います。googleでもWebサイトを常時SSL(https)にすると、SEO(検索順位)を優位にするというアナウンスもありましたので、切り替える方も増えていると思います。ここでは.htaccessにリダイレクト設定をしたけれど、リダイレクトしない、もしくは500エラー画面になり、サイトが全く表示されなくなった場合に確認すべきことを書きたいと思います。

WordPressの.htaccess

ドメイン配下に新しくフォルダを作り、その中にWordPressを入れて、実際の表示はフォルダなしでというパターンで設定している人が多いと思います。

https://shiritai.net/folder/・・・WordPress アドレス (URL)

・・・サイトアドレス (URL)

やり方は過去記事の
フォルダを作りサブディレクトリ(/wp/)にインストールしたWordPressをドメイン直下に表示【ルートディレクトリの変更】
に書いていますが、修正している.htaccessはほんとに正しいファイルですか?
もしかして.htaccessを1つ上の階層にアップしたことを忘れていませんか?
上記の/folder/にWordPressを格納しているとしたら
folderフォルダ
index.php
.htaccess ←これを修正する

もしも同じ階層に
wp-config.php
wp-contentフォルダ
.htaccess ←これは違います
があって、この.htaccessに書いていたら、書く場所が違いますので、1つ上の階層にある.htaccessにリダイレクト設定を書いてアップし直してみましょう。

パーミッションは正しいですか?

パーミッションは「604」が推奨されています。「644」になっていませんか?
レンタルサーバーによっては「644」が推奨されている場合もありますが、もしうまくいかない場合は「604」に変えてみてください。
エックスサーバーは「644」「604」どちらでもよいみたいです。
ロりポップは」「604」を推奨しています。

.htaccessの保存形式

文字コードと改行コードは正しいですか?
WordPressがUTF-8だからと思って、何も考えず
UTF-8
CR+LF
で保存してアップしていませんか?
もしかしたらSHIFT-JISで保存してアップするとうまくいく場合がありますので試してみてください。
できたらアップされている.htaccessを例えばエディタソフトのTeraPadを開いてドラッグでいれてください。
そして、文字/改行コード指定保存をクリックすると、保存形式が出てくると思うので、UTF-8なのかSHIFT-JISなのかを確認してみてください。

スペルミスはありませんか?

リダイレクトの命令は正しいですか?
たいていの人が誰かのサイトからコピペしていると思います。それはよいと思いますが、もしかして1文字くらいスペルミスがありませんか?

こんな感じの命令です。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

ただ自分の場合ですが、なぜかこちらだとトップ以外がリダイレクトされないという事態がありました。
トップからリンクをたどれば平気だけれど、例えばカテゴリページのアドレスをコピペしてブラウザの新規タブに貼り付けたら、ふつうにhttp://で表示されてしまいました。リダイレクトされていない状態です。
そんなときは

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

を試してみてください。これでうまくいくこともあると思います。
あと引っかかる点として、一番上で書いたようにWordPressをフォルダの中に入れている場合に

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

を.htaccessの中に入れていると思います。
リダイレクトをどこに書けばと迷うこともあると思います。
順番としてはリダイレクトを上にしてください。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

.htaccessの最後は空白

.htaccessの最後の行は空行としなければなりません。
リダイレクトの命令の後ではなく、.htaccessの最後の行です。
セキュリティ関連の物も色々書いて一緒にアップした場合、一番下が空行になっているか確認してください。

.htaccessが使える環境ですか?

こちらはWordPressを使っていれば大丈夫かと思いますが、お使いのサーバで、.htaccessの設置が許可されていないということはありませんか?
サーバ会社に問い合わせてみたり、マニュアルを確認してみてください。
また.htaccessの機能を制限されている可能性もあったりします。
リダイレクトにmod_rewriteというサーバのモジュールを使っていますが、もしこのmod_rewriteが動作しないサーバでしたら、当然リダイレクト処理を行うことができません。

念のために確認したい場合は、下記コードを入れてみてください。

<IfModule mod_rewrite.c>
  ErrorDocument 404 http://www.yahoo.co.jp/
</IfModule>

自分のサイトで絶対ないページアドレスを入れてみてください。リダイレクトでyahooに飛べば、機能するということになります。

最後に

リダイレクトが機能しないだけならまだましですが、500エラーで一切ページが表示できないとかなり慌てますよね。
バックアップを取っていれば、すぐ戻せばよいと思いますが、バックアップし忘れたというときはとにかく一度怪しい部分を消して再度アップしてください。
その際のチェックポイントは保存するときの文字コードと改行コードです。UTF-8なのかSHIFT-JISかは気をつけてください。
WordPressで、サイトの表示アドレスを変えている場合は.htaccessがなくなるとアドレスが思ったものにならないと思います。
なので、.htaccessをいったん削除してしまうという作戦は、慎重になったほうがよいと思います。
WordPressを使っておらず、SSL化のためにリダイレクトの命令だけを書いてアップするという場合は、いったん削除して間違い探しを丁寧にしながらアップし直せばきっと最後はうまくいくと思います。
慌てずに、丁寧に確認していきましょう!

コメント

  1. zakka says:

    中々うまくいかず困っていたところ辿り着きました。

    コードを書く場所が他のサイトには書いていなかったのでおそらくそこと書き方が違っていたと思います。

    ありがとうございました。

  2. 知りたいねっと管理人 says:

    zakkaさま

    書き込みありがとうございます。
    お役に立ててよかったです。
    エラーになると慌てますし、どうしたものやらと、途方にくれますよね。。

    こちらこそお礼のコメントうれしいです。
    ありがとうございました!