CakePHP+独自ドメイン+さくらサーバーの共用SSL

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
だいぶアホドック……いえ、アドホックなやり方になりますが、CakePHPで開発しているサイト(独自ドメインを当てている)にさくらサーバーの共用SSLを適用したときの設定を、ちょいとやってみましょう。

えー、何か面倒そうだなぁって思う方は、最後まで読み飛ばしてオッケーっす。今日の結論がそこにありますゆえ。



なぜこんな話をするのかと言うと

さくらサーバーの共用SSLを独自ドメインに使うと、何かURLがこんな風になるんですね。

http://secure***.sakura.ne.jp/独自ドメイン名/ドメイン以下のページ

だから例えば、あかつきのお宿はSSLを使ってないですけど、もしうちのサイトがさくらの共用SSLを使ったら、たぶんこんな感じのURLになります。

http://secure***.sakura.ne.jp/norm-nois.com/
http://secure***.sakura.ne.jp/norm-nois.com/novels/
http://secure***.sakura.ne.jp/norm-nois.com/musics/
http://secure***.sakura.ne.jp/norm-nois.com/blog/

secureの後ろの***は、たぶんアカウントによって違うと思われます。

で、これ自体はあまり問題ではない……のかどうかはちょっと怪しいとこなんですが、とりあえず問題ないってことにしておきましょう。

じゃあ何が問題なのかって言うと、実際に独自のドメインを取ってCakephpで開発したサイトにさくらサーバーの共用SSLを適用してページを開いてみれば分かるんですけど、cssとかjsのファイルをヘルパーを使って読み込んでいると、どうやらちゃんと読み込まれないみたいです。URLが変化しているせいなのは間違いないんですが、とにかく読み込まれない。画像もそうですね。

どうやらですが、共用SSL適用のページでは、こんな感じになっちゃってるっぽい。

//ヘルパーの記述
echo $form->css('common', null, array('media' => 'all'));
echo $form->js('jquery');

//読み込もうとするファイルのパス
https://secure***.sakura.ne.jp/css/common.css
https://secure***.sakura.ne.jp/js/jquery.js

どうやら『https://secure***.sakura.ne.jp/』がwebrootになるっぽい感じですね。だからパスが違ってて正しく読み込まれない。

まあ、解決方法としては絶対パスで読み込むようにしてやれば解決なんですが、httpsのページでhttpの画像とか読み込むと、ブラウザによっては警告が出たりするはず。

毎回それが出ちゃうのも何かちょっとね……って感じなので、何とかその辺は書き換えなくても良いようにしないと思う今日この頃なわけです。

これも全ページをSSLにしちゃって、画像とかのパスもhttpsの絶対パスにしてしまえば良いような気もするんですが、まあ、そういう方法で解決する人はそれで良いと思います。

でも今回はそういう感じにならない場合を想定した設定を行うってことで、一つよろしく頼みます。

ってなわけで。



よろしくメカドック

あ、間違えた。

アドホックですね。よろしくアドホック。

とりあえず、index.phpを書き換えて何とかしてしまいましょうってのが、今回の作戦です。

何でindex.phpを適切に書き直すって小見出しにしなかったんだろうね? まあ、ぶっちゃけよろしくメカドックって言いたかったからなんだけど、読み辛いこと山のごとしですね、これでは。でも後悔はしていない。

とりあえず、例によって結論から行きますか。

修正点は大きく二ヶ所。一つは書き加える、一つは書き換えるです。

//書き加える
if(isset($_ENV['HTTP_X_SAKURA_FORWARDED_FOR'])) {
    define('FULL_BASE_URL', 'https://secure***.sakura.ne.jp');
    $base = '/ドメイン名';
} else {
    $base = null;
}

//$Dispatcher = new Dispatcher()を書き換える
$Dispatcher = new Dispatcher(null, $base);

PHPには『$_ENV』っていうグローバル変数があるんですが、さくらサーバーの共用SSLを使ったページを開いているときは、この変数の中に『HTTP_X_SAKURA_FORWARDED_FOR』が入って来るみたいです。なので、それの有無を見て、『FULL_BASE_URL』の定数を書き換えてるわけですね。

この定数は、自分でソースの中に書く機会ってあまりないような気がするんですけど、cakeのコアライブラリの中を見たりしているとちょいちょい使っている定数なので、わりと重要な役割を果たしているようないないような?

あと大事なのは『$base』の方ですね。あまり詳しくソースの中を見てないから間違ってるかもしれないんだけど、たぶんこれのおかげで、secure***~があっても通常と同じようなURLの生成をCakeがしてくれたりするんじゃないかな。baseってくらいですからね。

こうしておけば、ヘルパーを使ってcssなんかを読み込むときも、ちゃんと読み込まれます。



もう一点だけ注意したい

CakePHPのコンポーネントにRequestHandlerってのがあるんですが、そのコンポーネントに『isSSL()』って関数があるんですね。これは今httpsのページにいるかどうかを判定するような感じの機能だと思うんですけど、何かさくらの共用SSLの場合だと、isSSL()でtrueが返って来ない。僕の書き方が間違えていただけかもしれないけど。

普通、httpsのページにいたらこの関数はtrueを返してくれるはずなんですけど、なぜかfalseが返って来る。だから判定ができない。

まあ、上でも書きましたがHTTP_X_SAKURA_FORWARDED_FORってやつがグローバル変数に入っているので、とりあえずそれで判断するで解決はするんですが……しかし何でかな?






こんな感じですかね。

そんなに面倒なことはしなくても良いんですが、でも無理矢理感もあるし、もしかしたらどっかで動作に不具合が出てくるかもしれない。そんときは僕にも情報をもらえると嬉しいっす。

まあ、とりあえず結論として言えることは……

さくらさん自身も独自ドメインに共用SSL使うのは非推奨だって言ってるし、なるべくならやらない方が良いってことですね。

うん、この一行で今日の話は完全に無駄に終わっちゃうね、うふふ。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください