概要
Laravel12で、学習がてらメンバー限定の掲示板appを個人開発しました。
Render.com(Web Service)× Neon(DB)を使用して無料枠でデプロイ。
その際にTailwind CSSが崩れた件について、デバッグの記録です。
実行環境
- Laravel12
- PHP 8.2.8
- Tailwind CSS 4.1
- Docker(Dockerfile)
- FrankenPHP(PHPアプリサーバー)
- Render.com(アプリケーションの実行環境:PaaS)
- Neon(サーバーレスPostgreSQL:DB)
問題点
Render.com でいろいろあったものの(前回の記事参照)
無事にRender.comのログに「Your service is live 🎉」の文字が(嬉)。
Available at your primary URL をブラウザで開いてみると、Tailwind CSSが崩れて表示されている‥(無念)。
デバッグ結論
「Mixed Content(混合コンテンツ)」 と呼ばれる現象によって、CSSの読み込みが拒絶されていた。
httpsのページなのにhttpのCSSを読み込もうとしていた。
Render.com側の環境変数だけではなく、Laravel側にも強制HTTPSのコードを追加して解決。
デバッグの細道(解決に至るまでの流れ)
CSSの表示に関することなので、まずはデプロイしたサイトをブラウザからデベロッパーツールで確認。
すると‥コンソールに
「(インデックス):1 Mixed Content: The page at 'https://trioboard.onrender.com/'
was loaded over HTTPS, but requested an insecure stylesheet
'http://trioboard.onrender.com/build/assets/app-DsiBOfCy.css'.
This request has been blocked; the content must be served over HTTPS.」
とエラー。
なぜかstylesheet がブロックされている???(何故に)。
「Mixed Content」について、AIティチャーに相談と解説を依頼。
Renderの環境変数を確認、とのこと。
実際確認してみると、APP_URLはHTTPS にしている。のに!?
念のため、Laravel側で強制HTTPSとのことで、ローカルの方で以下のコードを追加。
use Illuminate\Support\Facades\URL;
public function boot(): void
{
// 全ての準備が完了した後に実行される(実際に動かす)
if(app()->environment('production')){
URL::forceScheme('https');
}
}
その後、キャッシュをクリアしてからGitHubの方に再度プッシュ。
Render.comrで再度デビルド〜デプロイ作業。
無事、崩れていないトップページが表示されたのでした。
壁打ちAIティーチャーの解説と回答
壁打ちAIティーチャーに今回のエラーについて、素朴(?)な疑問をぶつけてみました。
以前、Laravel10で制作したWebサイトをXserverの共用サーバーにGitHubを経由してデプロイしている。
その際に、Laravel側で強制HTTPSを記述した記憶がない‥。あれ?
なぜ、Xserverの共用サーバーにデプロイ時にはこのようなことが起こらず、Render.com デプロイ時には発生したのか???
それはズバリ 「環境差異」 。
- 前回(Xserver)では Mixed Content が発生せず、今回(Render.com)では発生した理由は 「サーバー側の HTTPS の扱いが根本的に違うから」 です
とのこと。
Render の公式ドキュメントによると、
- HTTPS はロードバランサー側で終端され、アプリケーションには HTTP としてリクエストが届くという構造になっています。※
とのこと。※は以下の部分を解説してもらいました‥。
「Connect to your web service」
そして
- Xserverの時はサーバー側が至れり尽くせりでLaravelにお膳立て(HTTPSの通知)をしてくれていたが、RenderのようなモダンなPaaSでは、その伝言ゲームを自分で繋いであげる(forceScheme('https'))必要がある
とまとめてくれました。
デバッグの細道のひとりごと(反省と感想)
"デプロイすること"にいっぱいいっぱいで、インフラに対する認識がなく‥(汗)。
知らないって恐ろしい‥。
そして。
今回、Qiita投稿のため改めてエラーとデバッグを振り返るなかで出てきたサーバーごとの「環境差異」。
デバッグしている真っ只中では、気づかない視点でした‥。
技術記事をまとめると理解が深まる、というのは‥もしかしてこういうこと???
記事をまとめなかったら、”「Mixed Content(混合コンテンツ)」なのか‥” で終わっていたかもしれません。
振り返って検証できるのが記事投稿の良さ、なのかもしれない‥です。
書いてみるものですね。
書くからこそ、見えてくるのものもあるのですな‥。
学習、反省、また学習。
読んでいただいて、お疲れ様でした。
ありがとうございました。