Edited at

サクラのレンタルサーバーで共有SSLを使うとHTTPSを認識しない問題

More than 3 years have passed since last update.

サクラのレンタルサーバーで共有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」という値が設定されるので、それを使ってゴニョゴニョする。

ということで、こちらの元ネタのブログをどうぞ。

さくらレンタルサーバーの共有SSLを使う

さくらサーバでSSL通信にリダイレクト


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を直接使っていたので、両方に設定しないと問題が発生しました。


お客さんと話をして、レンタルサーバーでのホスティングをやめる、というのが本来の解決法な気はします。