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');
}
これで、デザインが崩れるという症状はなくなりました。