Laravel で、公開環境で表示崩れが起こってしました

Yossy
2024-03-27
2024-03-27

Laravel10 で作ったアプリを、ローカルの開発環境から、公開環境に、単純にコピーして動作させる予定だったんですが、なぜか、表示が崩れてしまう。

原因として分かったのは、

(1) ローカルの開発環境は「http」で、公開環境は「https」でアクセスするという違いがあった 
(2) どうやら、Laravel の asset 関数が返す URL が http 固定されている

つまり、

<link href="{{ asset('css/example.css') }}" rel="stylesheet">
と書くと、https のURLでアクセスしたとしても、

<link href="http://localhost/css/exsample.css" rel="stylesheet"><
になってしまうと、、、

https でアクセスすると、https と http が混在するとになるので、ブラウザが http を読み込まなくなってしまった結果、CSS が読み込まれず、表示が崩れてしまうということが発生してしまっていました。

調べると、https を返すように強制することもできるようで、

 

URL::forceScheme('https');

と書くとよいそうです。

で、これ、どこに書けばいいんだろう?と悩んでしまったのですが、アプリケーション全体の設定としたかったので、routes/web.php に書いてみました。

参考:リクエスト・ライフサイクル
https://laravel.com/docs/10.x/lifecycle


ただ、このコードを書くと、ローカルの開発環境でも、https が強制されることになるので、
それは、それで、面倒なので、.env ファイルの、APP_ENV の値を、読み取って、production と staging の時だけ、https 強制されるようにします。

.env の以下の項目を見るようにします。

APP_ENV=local
route/web.php の先頭に、以下のようなコードを追加しました。

 

<?php

use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;

if (config('app.env') === 'production' or config('app.env') === 'staging') {
    URL::forceScheme('https');
}
これで、デザインが崩れるという症状はなくなりました。