15.

Laravel asset() ヘルパー徹底解説 — mix / vite / url との違いと CDN 設定

編集
この記事の要点
  • asset('css/app.css')public/ 配下のファイルへの完全 URL を返す(例: http://example.com/css/app.css
  • ベース URL は config/app.phpurlAPP_URL)。サブドメイン / CDN 配信は ASSET_URL でも上書き可
  • HTTPS 強制は secure_asset()。または AppServiceProviderURL::forceScheme('https')
  • キャッシュバスティングが必要なら mix()(Laravel Mix)か vite()(Vite)を使う — ファイルにハッシュ付き URL を生成
  • url() はアプリケーション URL(ルート向け)、asset() は静的ファイル向け、と用途が違う

asset() の基本

asset()public/ ディレクトリ内のファイルへの URL を生成するヘルパー関数です。Blade テンプレートで CSS / JS / 画像を読み込むときの定番です。

{{-- 例: APP_URL=http://example.com の場合 --}}


{{-- → http://example.com/css/app.css --}}


{{-- → http://example.com/js/app.js --}}

logo
{{-- → http://example.com/images/logo.png --}}

ファイル配置の前提

プロジェクトルート/
├── app/
├── public/                  ← Web 公開ルート(DocumentRoot)
│   ├── index.php
│   ├── favicon.ico
│   ├── css/
│   │   └── app.css          ← asset('css/app.css') で参照
│   ├── js/
│   │   └── app.js
│   └── images/
│       └── logo.png
├── resources/               ← 元ソース。Mix/Vite でビルドして public/ へ
└── ...

URL の組み立てロジック

asset() が返す URL は次の優先順位で決まります:

  1. config('app.asset_url')ASSET_URL 環境変数)— CDN 等を別ホストにしたい場合
  2. config('app.url')APP_URL 環境変数)
  3. リクエストの scheme://host
// 内部実装イメージ (簡略)
function asset(string $path, ?bool $secure = null): string
{
    return app('url')->asset($path, $secure);
}

// .env 例
APP_URL=https://example.com
ASSET_URL=https://cdn.example.com   // ← 設定すると asset() がこちらを優先

secure_asset() による HTTPS 強制

{{-- 常に https:// で出力したい --}}


{{-- 第 2 引数で個別指定も可 --}}

本番環境では AppServiceProvider::boot() で一括強制するのが楽です:

use Illuminate\Support\Facades\URL;

public function boot()
{
    if ($this->app->environment('production')) {
        URL::forceScheme('https');
    }
}

asset / url / route の違い

ヘルパー用途出力例
asset('css/app.css')静的ファイル(public/)https://example.com/css/app.css
url('/users')アプリの任意 URLhttps://example.com/users
route('users.show', 1)名前付きルートhttps://example.com/users/1
action([UserController::class, 'show'], 1)コントローラから生成https://example.com/users/1

キャッシュバスティングが必要な場面

asset('css/app.css') はそのまま /css/app.css を出力するため、ブラウザがキャッシュした古い CSS を読み続ける問題が起きます。デプロイのたびに新しい URL にしたい場合は Mix / Vite を使います。

{{-- Laravel Mix (mix-manifest.json を参照) --}}

{{-- → /css/app.css?id=8a1b3c... のようにハッシュ付き --}}

{{-- Vite (Laravel 9.19+) --}}
@vite(['resources/css/app.css', 'resources/js/app.js'])
{{-- → 
        --}}

CDN 配信のための ASSET_URL 設定

# .env で別ホストを指定
APP_URL=https://example.com
ASSET_URL=https://d1xxxxxx.cloudfront.net

# Blade での出力結果
# asset('images/logo.png')
# → https://d1xxxxxx.cloudfront.net/images/logo.png

# url('/users') はアプリ側 (example.com) のまま
# → https://example.com/users

よくあるトラブル

症状原因 / 対処
本番で http:// になるAPP_URL が https:// になっていない、または URL::forceScheme('https') 未設定
ローカルでドメインが localhost 以外になるAPP_URL を上書き。config:clear 必須
サブディレクトリで動かしたら 404APP_URL に /myapp を含める。例: https://example.com/myapp
storage/app/public が見えないphp artisan storage:link でシンボリックリンク作成

storage と asset の連携

# storage/app/public → public/storage のシンボリックリンクを張る
php artisan storage:link
{{-- アップロード画像を表示 --}}


{{-- または Storage ファサード --}}

FAQ

Q: asset() の出力をすべて HTTPS にしたい
A: APP_URL=https://... に加え、AppServiceProviderURL::forceScheme('https')。リバプロ配下なら TrustProxies ミドルウェアも設定。

Q: バージョン文字列を付けたい(?v=1.2
A: 簡易にやるなら asset('css/app.css') . '?v=' . config('app.version')。本格的には Mix / Vite を使用。

Q: 画像 URL を Blade 内で組み立てるベストプラクティス
A: アップロード画像なら Storage::url()、固定アセットなら asset()、CDN 経由なら ASSET_URL + asset()

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)