この記事を三行にまとめると
httpからhttpsのリダイレクトできなくね?来週になっても解決はしないけどもさ
乗り換えかな、やっぱり
Googleさんも常時SSLを推奨する昨今、僕もちょっとは気にした方が良いのかもしれないなーと思い始めました。そこであかつきのお宿にもSSLを導入してみようと思ったのですが、結論から言うと上手くいきませんでした。
あかつきのお宿はさくらインターネットのレンタルサーバー(スタンダードプラン)で動いています。なのでコントロールパネルから独自SSLの設定を行う必要があるわけですが、証明書をインストールしてhttpsでアクセスするとこまではともかく、httpsのアクセスのみを許可するところが上手くいかなかった。httpからhttpsにリダイレクトさせるところが実現できませんでした。
ということで、この記事はさくらのレンタルサーバーでサイトをSSL化する方法を書いたものではないです。「スタンダードプランだとhttpからhttpsのリダイレクトできなくね?」っていう内容の記事です。それを求めてここにたどり着いた人には先に謝っときます。
すまぬ……すまぬ……。
今回はSSLの証明書をインストールするところは省略します。話したいのはその先なので、独自SSLの導入に関しては、さくらインターネットもサポート情報を公開しているのでそちらを見てみてください。
独自SSLの導入
また、グローバルサインで証明書を取得する方法で良ければ、僕も以前に記事を書いたことがあるので、参考になるようでしたら。
グローバルサインのSSLを使ってサイトをhttpsでアクセスできるようにする
スタンダードプランの場合はSNI SSLしか使えないみたいです(たぶん)
これでhttpsで自分のサイトにアクセスできるようになります。
あかつきのお宿だとこんな感じっすね。無事に保護された通信となっておりやす。
httpで同じページにアクセスするとこの変数がない。
つまりこの変数のあるなしで条件分岐できるので、変数がない場合にhttpsにリダイレクトする方法が使える。PHPの中でリダイレクト処理を行なっても良いですが、CakePHPやWordpressでサイトを動かしているなら.htaccessに書くのがよくあるやり方でしょう。
.htaccessにこんな風に書けばhttpからhttpsのリダイレクトが実現できる。
それはmod_rewriteを使ってURLの書き換えを行った後の場合。この場合、上記のやり方では判定ができません。「mod_rewriteでURLの書き換えを行うって何よ?」って方は、とりあえずCakePHPやWordpressでサイトを動かしている場合はそれが行われていると思ってください。ちなみにさっきは「test.php」というファイルをサーバー上に用意してそこにアクセスした結果なので、URL書き換えの対象外のページになります。
ということで、今度はCakePHPの中で動いている適当なページでサーバー変数を見てみましょう。
TestsControllerのindexアクションのページです。まずはhttpから。
続いてhttps。見事に「HTTPS」がありませんね。それどころかアドレスバーから保護された通信って文字すらも消えたぞ。
つまりCakePHPで動いているサイトでは、HTTPSによる判定でリダイレクトさせることは不可能っつー話なのです。Wordpressも同様。URLの書き換えを行わずにサイトを動かす方法もあるにはあるんですが、今回はそれはやらない方向で。
.htaccessにこう書けばさくらインターネットでもhttpsへのリダイレクトが可能になると。
なるほど。楽勝じゃん。
そう思っていた時期が僕にもありました。
さっきの画像をもう一度見てみましょう。「norm-nois.com/tests/index」にhttpでアクセスしているやつ。
そうなんです。httpでも「HTTP_X_SAKURA_FORWARDED_FOR」っていう変数があるんですよ。適当にぼかし入れちゃってますけどIPアドレスもきちんとセットされておる。
つまり多くの方が言っているHTTP_X_SAKURA_FORWARDED_FORでの判定が使えないってことです。念のため他のサーバー変数も一通り眺めてhttpとhttpsで違うものがないか確認してみたんですが、残念ながらありませんでした。
みなさんの情報が間違っているというわけではないです。確かに僕も昔仕事でさくらのサーバーを使った際、このサーバー変数を使ってリダイレクトを実装した記憶がある。当時はSNI SSLとかいう機能がなかったから、その辺に何かからくりがあるのかな。でも他の方の記事を参考にする限りSNI SSLでもHTTP_X_SAKURA_FORWARDED_FORで判定できるっていう情報もあるし……うーん、仕様が変わったんですかねぇ。
何はともあれ、サーバー変数を利用してのリダイレクトは、今回僕が試した限りでは無理でした。まあさくらのサポート情報のページでも「SSLのみのアクセス許可(HTTPアクセスの制限)や、mod_rewriteによるURLの書き換えはできません。」ってはっきり書いてますからね。どうしようもないのかもしれません。
SSL利用時の注意点
直接メールで問い合わせてもみたんですが、「その他の環境変数をご利用いただくことで解決できる可能性はございますが、弊社では【URLの書き換えはできない】ことを前提としてサービスを提供いたしておりますため、回避策の確認は行っておりません。何卒、ご了承ください。」と言われてしまいました。その他の環境変数って具体的に何さって感じだけど「知らねーよてめーで探せよこの貧乏暇なしクソプログラマーめ」って感じだったので(もちろんそんな言い方はされませんでしたが)、今回の僕には解決できませんでした。
残念無念また来週……いや、来週になっても解決はしないけどもさ。
結論としてはhttpからhttpsへのリダイレクトを実現したいのであれば別のサーバーに乗り換えるのが得策なのかなって感じです。あるいはスタンダードからもっと上のプランに上げるとか(それで解決できるかは分かりませんが)を検討するのが良いのかなと。
プランをこのままで行くなら、リダイレクトはあきらめてhttpとhttpsのどちらでもアクセスできるようにはしておいて、URLの正規化だけ行なっておくとかしかできることはなさそうです。
httpでアクセスした時にheadタグ内にこの記述があれば「このページのオリジナルのURLはhttpsの方ですよ〜」と検索エンジンなどに示すことができます。
今回は記事を書くために一時的にSSLを有効にしただけなので、実際のあかつきのお宿はhttpでしかアクセスできない状態です。
それにしても、どうしてさくらインターネットはこういう仕様なんでしょうね。常時SSL化が騒がれてる現状を考えると、なおさらリダイレクトができるような仕様にした方が良いと思うのですが……まあ安いプランだからね。その辺をしっかり対応したいならもっとちゃんとお金払って専用サーバーにでも乗り換えろってことなのかもしれません。
でも今のところその予定はないので、お宿はしばらくは現状維持になりそうです。もし本当にちゃんとサイトをSSL化させるってなった時は……乗り換えかな、やっぱり。
あかつきのお宿はさくらインターネットのレンタルサーバー(スタンダードプラン)で動いています。なのでコントロールパネルから独自SSLの設定を行う必要があるわけですが、証明書をインストールしてhttpsでアクセスするとこまではともかく、httpsのアクセスのみを許可するところが上手くいかなかった。httpからhttpsにリダイレクトさせるところが実現できませんでした。
ということで、この記事はさくらのレンタルサーバーでサイトをSSL化する方法を書いたものではないです。「スタンダードプランだとhttpからhttpsのリダイレクトできなくね?」っていう内容の記事です。それを求めてここにたどり着いた人には先に謝っときます。
すまぬ……すまぬ……。
今回はSSLの証明書をインストールするところは省略します。話したいのはその先なので、独自SSLの導入に関しては、さくらインターネットもサポート情報を公開しているのでそちらを見てみてください。
独自SSLの導入
また、グローバルサインで証明書を取得する方法で良ければ、僕も以前に記事を書いたことがあるので、参考になるようでしたら。
グローバルサインのSSLを使ってサイトをhttpsでアクセスできるようにする
まずはサイトの確認
SSLの設定が無事に完了するとコントロールパネルのドメイン設定のところがこんな感じになります。スタンダードプランの場合はSNI SSLしか使えないみたいです(たぶん)
これでhttpsで自分のサイトにアクセスできるようになります。
あかつきのお宿だとこんな感じっすね。無事に保護された通信となっておりやす。
httpsの判定
通常、httpsでサイトにアクセスするとサーバー変数の中に「HTTPS」という変数が入って来ます。httpで同じページにアクセスするとこの変数がない。
つまりこの変数のあるなしで条件分岐できるので、変数がない場合にhttpsにリダイレクトする方法が使える。PHPの中でリダイレクト処理を行なっても良いですが、CakePHPやWordpressでサイトを動かしているなら.htaccessに書くのがよくあるやり方でしょう。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://norm-nois.com/$1 [R=301,L]
</IfModule>
.htaccessにこんな風に書けばhttpからhttpsのリダイレクトが実現できる。
mod_rewriteを使っている場合
通常ならさっきのやり方で良いんですが、残念ながらさくらインターネットではこの判定が使えない場合もあります。それはmod_rewriteを使ってURLの書き換えを行った後の場合。この場合、上記のやり方では判定ができません。「mod_rewriteでURLの書き換えを行うって何よ?」って方は、とりあえずCakePHPやWordpressでサイトを動かしている場合はそれが行われていると思ってください。ちなみにさっきは「test.php」というファイルをサーバー上に用意してそこにアクセスした結果なので、URL書き換えの対象外のページになります。
ということで、今度はCakePHPの中で動いている適当なページでサーバー変数を見てみましょう。
TestsControllerのindexアクションのページです。まずはhttpから。
続いてhttps。見事に「HTTPS」がありませんね。それどころかアドレスバーから保護された通信って文字すらも消えたぞ。
つまりCakePHPで動いているサイトでは、HTTPSによる判定でリダイレクトさせることは不可能っつー話なのです。Wordpressも同様。URLの書き換えを行わずにサイトを動かす方法もあるにはあるんですが、今回はそれはやらない方向で。
さくら独自のサーバー変数
「さくらインターネット http https リダイレクト」とかで検索すると、さくらのレンタルサーバーを使っていてSSLページを開いた場合は「HTTP_X_SAKURA_FORWARDED_FOR」という独自のサーバー変数にIPアドレスが入るので、HTTPSの代わりにこの変数のあるなしでリダイレクトを実現できる……という情報がわんさか出てくる。<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://norm-nois.com/$1 [R=301,L]
</IfModule>
.htaccessにこう書けばさくらインターネットでもhttpsへのリダイレクトが可能になると。
なるほど。楽勝じゃん。
そう思っていた時期が僕にもありました。
さっきの画像をもう一度見てみましょう。「norm-nois.com/tests/index」にhttpでアクセスしているやつ。
そうなんです。httpでも「HTTP_X_SAKURA_FORWARDED_FOR」っていう変数があるんですよ。適当にぼかし入れちゃってますけどIPアドレスもきちんとセットされておる。
つまり多くの方が言っているHTTP_X_SAKURA_FORWARDED_FORでの判定が使えないってことです。念のため他のサーバー変数も一通り眺めてhttpとhttpsで違うものがないか確認してみたんですが、残念ながらありませんでした。
みなさんの情報が間違っているというわけではないです。確かに僕も昔仕事でさくらのサーバーを使った際、このサーバー変数を使ってリダイレクトを実装した記憶がある。当時はSNI SSLとかいう機能がなかったから、その辺に何かからくりがあるのかな。でも他の方の記事を参考にする限りSNI SSLでもHTTP_X_SAKURA_FORWARDED_FORで判定できるっていう情報もあるし……うーん、仕様が変わったんですかねぇ。
何はともあれ、サーバー変数を利用してのリダイレクトは、今回僕が試した限りでは無理でした。まあさくらのサポート情報のページでも「SSLのみのアクセス許可(HTTPアクセスの制限)や、mod_rewriteによるURLの書き換えはできません。」ってはっきり書いてますからね。どうしようもないのかもしれません。
SSL利用時の注意点
直接メールで問い合わせてもみたんですが、「その他の環境変数をご利用いただくことで解決できる可能性はございますが、弊社では【URLの書き換えはできない】ことを前提としてサービスを提供いたしておりますため、回避策の確認は行っておりません。何卒、ご了承ください。」と言われてしまいました。その他の環境変数って具体的に何さって感じだけど「知らねーよてめーで探せよこの貧乏暇なしクソプログラマーめ」って感じだったので(もちろんそんな言い方はされませんでしたが)、今回の僕には解決できませんでした。
残念無念また来週……いや、来週になっても解決はしないけどもさ。
URLの正規化くらいで我慢
と、いうわけで。結論としてはhttpからhttpsへのリダイレクトを実現したいのであれば別のサーバーに乗り換えるのが得策なのかなって感じです。あるいはスタンダードからもっと上のプランに上げるとか(それで解決できるかは分かりませんが)を検討するのが良いのかなと。
プランをこのままで行くなら、リダイレクトはあきらめてhttpとhttpsのどちらでもアクセスできるようにはしておいて、URLの正規化だけ行なっておくとかしかできることはなさそうです。
<link rel="canonical" href="https://norm-nois.com/***">
httpでアクセスした時にheadタグ内にこの記述があれば「このページのオリジナルのURLはhttpsの方ですよ〜」と検索エンジンなどに示すことができます。
今回は記事を書くために一時的にSSLを有効にしただけなので、実際のあかつきのお宿はhttpでしかアクセスできない状態です。
それにしても、どうしてさくらインターネットはこういう仕様なんでしょうね。常時SSL化が騒がれてる現状を考えると、なおさらリダイレクトができるような仕様にした方が良いと思うのですが……まあ安いプランだからね。その辺をしっかり対応したいならもっとちゃんとお金払って専用サーバーにでも乗り換えろってことなのかもしれません。
でも今のところその予定はないので、お宿はしばらくは現状維持になりそうです。もし本当にちゃんとサイトをSSL化させるってなった時は……乗り換えかな、やっぱり。