質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Laravel 5

    1883questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Let's Encrypt

    39questions

さくらのレンタルサーバLite+Laravel5+Let’sEncryptでhttpに強制リダイレクトされる

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 463

nnahito

score 1708

 環境

  • さくらのレンタルサーバLiteプラン
  • さくらのレンタルサーバで提供される「Let's Encrypt」
  • Laravel5.5

 質問概要

ページ内の相対パスのリンクをクリックすると、
httpsからhttpになってページ遷移する

《例》
https://example.com

<a href="/top/">TOP</a>をクリック

http://example.com/top(https→httpに変わった)

この理由は何故なのでしょうか?
さくらのレンタルサーバに問い合わせたところ、

恐れ入りますが、弊社サーバ側に、自動的にURLを書き換えるような機
能はございません。

という回答をいただきましたので、迷宮入りになってしまいました。。。
自宅で遊びでたてているIISのサーバでは、同じLaravel+Let’sEncryptを使っていても、このような現象は起こりません。

何故このような現象が生じるのでしょうか。
ご存じの方がいらっしゃいましたら、ご教示いただけますと幸いです。

 解決方法

AppServiceProvider.phpのbootメソッドを変更

public function boot() {

        // さくらのレンタルサーバで、httpsからhttpに強制リダイレクトされてしまう現象回避用
        if (isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) {
            $request = \Request::instance();
            $request->server->set('HTTPS', "on");

            $_SERVER['HTTPS'] = 'on';
            $_ENV['HTTPS'] = 'on';
        }

    }

bladeのリンクの末尾から「/」を取る。
例:/top//top

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

さくらサーバのSSLは $_SERVER['HTTPS'] = 'on'; が設定されていないので、$_SERVER[‘HTTP_X_SAKURA_FORWARDED_FOR’] を見て代入する必要があるようです。

【さくらサーバーのSSLでLaravel5を正しく動作させる - アルファブレンド プログラミングチップス】
http://alphabrend.hatenablog.com/entry/2016/06/28/222431

【サクラのレンタルサーバーで共有SSLを使うとHTTPSを認識しない問題 - Qiita】
https://qiita.com/asaokamei/items/dee0ec9c0f00b251d38e

【さくらレンタルのSSLでハマる - technopolistechnopolis】
http://elementa.net/technopolis/wordpress/post-669/

【さくらのレンタルサーバーで常時SSL/TLSを設定する | サイト公開時 | ドキュメント | a-blog cms developer】
https://developer.a-blogcms.jp/document/deploy/sakura-ssl.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/29 20:32

    ご回答ありがとうございます。
    いただきました情報をもとに、
    AppServiceProvider.phpの中身を以下のように書き換えましたが、
    だめなようでした。。。
    public function boot()
    {
    // さくらのレンタルサーバで、httpsからhttpに強制リダイレクトされてしまう現象回避用
    if (isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) {
    $request = \Request::instance();
    $request->server->set('HTTPS', 'on');
    }
    }

    また、wwwを含むマルチドメインに設定したものを、
    wwwを付与せずマルチドメインとして使用する(上級者向け)
    に変更しましたが、だめなようです……

    キャンセル

  • 2017/12/30 18:20

    無事解決しました!
    ありがとうございます

    キャンセル

  • 2017/12/30 18:22

    解決されたようでよかったです。どのように解決したかコードを回答欄に追記いただけませんか?このページに辿り着いた同じ疑問を持つ人のために、ぜひお願いします。

    キャンセル

  • 2017/12/30 18:22

    すいません、いま追記いたしました!

    キャンセル

  • 2017/12/30 18:25

    ありがとうございます!

    キャンセル

  • 2017/12/30 18:28

    こちらこそありがとうございます!
    おかげさまで解決することができました!!
    また何かありましたら、お力をお貸しいただけますと幸いです><

    キャンセル

+1

この理由は何故なのでしょうか?

さくらインターネットのhttps実現方法がどうなっているのか分からなくて、あくまでの可能性を示唆することくらいしか出来ないのですが、リバースプロキシ環境下ではLaravelがhttpsアクセスだと認識できない場合があるみたいです。

例えばroutes/web.phpに以下のようなルーティングを追加して /schema_test にアクセスすると、Laravelがhttpsアクセスと認識しているか確認できると思います。
(認識してるならtrueが、していないならfalseがブラウザに表示される

Route::get('/schema_test', function (\Illuminate\Http\Request $request) {
    dd($request->secure());
});

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/29 01:30

    ご回答ありがとうございます。
    確かにいただきましたコードを実行してみたところ、falseが返ってきました。

    キャンセル

  • 2017/12/29 01:41

    ひとまずhichon様の
    https://stackoverflow.com/questions/28402726/laravel-5-redirect-to-https
    の内容をコピペで行ってみましたが、延々とループが続くようで、エラーが返ってきます……

    行ったのは、

    namespace MyApp\Http\Middleware;

    use Closure;

    class HttpsProtocol {

    public function handle($request, Closure $next)
    {
    if (!$request->secure() && env('APP_ENV') === 'prod') {
    return redirect()->secure($request->getRequestUri());
    }

    return $next($request);
    }
    }

    のファイルを作成

    kernel.phpに
    App\Http\Middleware\HttpsProtocol:class
    を追加

    です

    キャンセル

  • 2017/12/29 03:04

    なるほどなるほど、Herokuなどでも見られるのと同じ問題だと思います。
    httpにリダイレクトされる細かい原因はちゃんと調べてないのですが、LaravelのURL生成するようなメソッドは現在認識しているスキームに合わせて生成します。
    つまりhttpアクセスされていると認識しているなら、httpなURLを生成します。その影響なのかなと思います。

    最近までは上記のHttpsProtocolミドルウェアなどを作って自分たちでなんとか解決していたのですが、公式で対応されたみたいです。
    https://readouble.com/laravel/5.5/ja/requests.html
    こちらのページの「信用するプロキシの設定」の項目がそれになります。
    わりと最近追加されたっぽくて、Laravel5.5の比較的後半のバージョンにしかないかもしれません。
    v5.5.28にはありましたが、v5.5.21では見つけられませんでした。

    僕も使ったことがないのに人に勧めるのはあれですが、以下のような対応になるかと思います。

    1. 上記で作ったHttpsProtocolsを外す・削除する
    2. app/Http/Middleware/TrustProxies.phpを以下に修正する
    * protected $proxies = '**';

    キャンセル

  • 2017/12/29 20:26

    ご返信ありがとうございます。
    こちら追記してみましたが、だめなようです・・・

    キャンセル

0

これかな
つhttps://stackoverflow.com/questions/28402726/laravel-5-redirect-to-https

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/27 11:50

    ご回答ありがとうございます。

    こちら、「Laravel 4.2」の物のようですが大丈夫でしょうか?
    また、なぜhttps→httpのリダイレクトが発生するのでしょうか……?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Laravel 5

    1883questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Let's Encrypt

    39questions