16
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-02

サクラのレンタルサーバーで共有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を直接使っていたので、両方に設定しないと問題が発生しました。

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

16
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?