サクラのレンタルサーバーで共有SSLを使ったら、PHPがhttpsと認識してくれなかった。本来なら、下記のコードで
echo isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && $_SERVER['HTTPS']!== 'off';
判定できるのだけれど、HTTPSの項目が抜け落ちてしまう。
書いてみると、意外と判定は面倒なのですね。
原因はプロキシサーバー
サクラのホームページを見ると、共有SSLを使うと、プロキシとして動作すると書いてある。これが原因とのこと。
ややこしいのだけれど、httpsで接続しても、直接phpを叩く場合は問題ない。
この症状がでるのは、.htaccessなどでmod_rewriteしたような場合のみ。らしい。(この辺、よくわかってない)。
対処方法
共有SSLプロキシを使った場合、サーバー変数に「HTTP_X_SAKURA_FORWARDED_FOR」という値が設定されるので、それを使ってゴニョゴニョする。
ということで、こちらの元ネタのブログをどうぞ。
Laravel 4.2 での対処法
この問題が出たのは、Laravel 4.2で開発していたとき。
まずはSymfonyのRequestクラスにあるisSecureというメソッドでプロキシの設定が出来ないか検討してみた。
が、httpsを含まないといけない、とか書いてあって無理そう。
面倒くさがり屋なので、早速諦めて別方法を模索。
こちらの「Laravel で常に https でアクセスさせる」を参考にして、フィルターとして次を実装してみた。ファイルは「app/filters.php
」。
App::before(function($request)
{
// サクラサーバーの共有SSL対策
/** @var Request $request */
if (App::environment('production')) {
$request->server->set('HTTPS', 'on');
\URL::forceSchema('https');
if (!isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) {
return Redirect::secure($request->path());
}
}
});
「本番環境の場合、URLは全部httpsで始めること、そしてX_SAKUR…が未設定ならhttpsで再接続」ということですね。
【2015/01/23追加】
コードに$request->server->set('HTTPS', 'on');
を追加しました。$request側にもHTTPSの設定を行う必要がありました。具体的にはPaginationで、$requestのURLGeneratorを直接使っていたので、両方に設定しないと問題が発生しました。
お客さんと話をして、レンタルサーバーでのホスティングをやめる、というのが本来の解決法な気はします。