最近、SSLの導入を何度か体験したのですが、ややこしいなと思ったのがレンタルサーバーによって必要な手順が異なるということでした。
今回は、僕が特に困惑してしまったhttpsリダイレクト処理の書き方について、レンタルサーバーごとにまとめていこうと思います。
.htaccsess
でごにょごにょする、あれですね。
以下の4つのサーバーについてまとめていこうかと思います。
- さくらインターネット
- ロリポップ!
- エックスサーバー
- AWS
この内、実際にSSL化させたことがあるのはさくらとロリポップの2つです。
エックスサーバーとAWSはそのついでに調べたものになります。もし違う!と気づいたことがあればコメントください。
基本知識
まずはhttpからhttpsへリダイレクトさせる方法(SSLリダイレクト)の基礎知識を整理しておきます。
今回の手法では、mod_rewrite
という機能を活用しますので、その辺の知識を少しまとめてみました。
mod_rewriteとは
Apacheで使用できるモジュールの一つで、正規表現を用いて条件などを指定し、URLのリライトをしてくれるものです。
つまり、今回まとめていくSSLリダイレクトの手法は、Apacheを使用しているサーバーでしか使えません。(ほとんどのレンタルサーバーがApacheなので特に意識する必要はないです。)
VPSなどでWebサーバーを稼働させている場合は、mod_rewriteモジュールをインストールする必要があるかもしれません。
mod_rewriteで使用するディレクティブ(命令文)
mod_rewriteモジュールではいくつかの命令文が使用できます。その中で、今回使用していくものだけ少し調べてみました。
- RewriteEngine
- mod_rewriteを有効にするか無効にするかを宣言できる。
- RewriteRule
- どのように書き換えるのかを指定できる。
RewriteRule {パターン} {置換内容}
の形式をとり、{パターン}に一致したものを{置換内容}に書き換えます。[R]というフラグと併用(後述)し、リダイレクトを実行する。 - RewriteCond
- どんな場合にリライトするかどうか、条件を指定できる 。
RewriteCond {条件}
の形式をとります。RewriteRuleの前に記述。
フラグについて
mod_rewriteでは各ディレクティブごとに使用可能なフラグというものがあり、それによって詳細な設定を行っていきます。
とりあえず今回使用するものだけを紹介しておきます。
- RewriteRuleで使用できるフラグ
- R : 指定したURLにリダイレクトする。
L : URL書き換え処理を終了する。redirectのR, lastのLです。
Rewrite Rule {パターン} {置換内容} [R,L]
というような書き方をします。
また、[R=301]を指定すると、301リダイレクトが可能。
「301リダイレクト」とは、元のURLがすでに持っているGoogleからの評価を引き継げるリダイレクト方式のこと。SSLを途中で導入した場合には301を忘れずに。
さて、以上のことを頭に入れておけば、以下で記述している内容がなんとなく理解できるかと思います。
理解せずにコピペでもOKですが。笑
mod_rewriteについてもっと詳しく知りたい時はこちらのサイトがすごく詳しく説明してくれていますので、是非ご覧ください。
では本題へいきましょう。
ロリポップの場合
.ataccessに以下を追記。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
シンプルですね。
HTTPSがoffなら、http://~~をhttps://~~で301リダイレクトさせるよっていう処理です。
さくらインターネットの場合
.ataccessに以下を追記。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
さくらインターネットではRewriteCondの部分にHTTP:X-Sakura-Forwarded-For
という記述を使用します。
ロリポップの場合の{HTTPS} off
ではダメなので、注意が必要です。
リライトルールは同じですね。
エックスサーバーの場合
.ataccessに以下を追記。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
エックスサーバーでは、リライトルールの方に$1
を使用せず、REQUEST_URI
というのを使用するようです。
AWSの場合
.ataccessに以下を追記。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
こちらの記述は、以下の記事に載っていたものです。
AWS常時SSL リダイレクトループしない.htaccessの書き方
何度か試行錯誤した後の結果みたいなので、その過程も知りたい方は読んでみてください。
その他注意点など
以上、4つのサーバーについてsslリダイレクトの書き方をまとめました。
上記4つ以外のサーバーを使用している場合でも、サーバーによって書き方が違うんだなあということさえ覚えておけば何かの役に立つかもしれません。
また、リライトの記述場所によっても500エラーが出ることがあるみたいです。
例えば、WordPressの場合だとWordPressによって自動追記されている内容よりも後に記述している場合にエラーが発生するケースがあったりするそうなので、エラーが出た時は.htaccessの冒頭付近に記述するようにしてみてください。