Laravel 13をApache・XAMPPで動かす:VirtualHost・.htaccess・public_htmlの配置方法
作成日:2026.08.27
Laravel 13のプロジェクトをWindowsのXAMPP Apacheで動かすために、VirtualHostでpublicをDocumentRootに指定する方法、.htaccessでpublicへ振り分ける方法、public_htmlへpublicの中身を配置してindex.phpの参照先を変更する方法を解説します。.envやstorageなどを公開しないための注意点、Viteのビルド成果物、ApacheとLaravelのログを使ったトラブルシューティングも整理します。
目次
Laravelの開発中は、まずphp artisan serveで画面を確認することが多いかと思います。
しかし、XAMPPのApacheからLaravelを動かしたい場合は、プロジェクトを置く場所やApacheの設定を考える必要があります。特に、Laravelのプロジェクト全体をそのままWeb公開すると、.envやvendorなどへアクセスされる可能性があります。
今回は、Laravel 13のプロジェクトをWindowsのXAMPP Apacheへ配置する方法を、次の3パターンに分けて整理します。
- VirtualHostで
publicをDocumentRootに指定する - プロジェクト配下の
.htaccessでpublicへ振り分ける public_html相当の公開ディレクトリへpublicの中身を配置し、index.phpのパスを変更する
Apacheの設定を変更できる範囲は環境によって異なるため、利用できる方式を選んでください。Laravelの公式ドキュメントでも、Webサーバーからはアプリケーションのpublic/index.phpへリクエストを渡す構成が案内されています。
前提
今回の説明では、次の環境を想定します。
- Windows 11
- XAMPP
- Apache 2.4系
- PHP 8.3以上
- Composer
- Laravel Framework 13.x
- Node.js、npm、Viteを利用するプロジェクト
XAMPPやApache、PHPの正確なバージョンは、実際に利用する環境で確認してください。Laravel 13.xにはPHPのバージョンや必要な拡張機能の条件があるため、Apacheが読み込むPHPが条件を満たしていることも確認します。
この記事では、ローカルのXAMPP環境で画面を確認するところまでを扱います。インターネットへ公開するためのSSL証明書、ファイアウォール、デプロイ自動化、キューワーカーの常駐設定などは対象外です。
LaravelをApacheへ配置するときの考え方
Laravelのプロジェクトには、アプリケーションのソースコードや設定ファイルが含まれています。Webから直接アクセスさせるのは、基本的にpublicディレクトリです。
laravel13/
├─ app/
├─ bootstrap/
├─ config/
├─ database/
├─ public/
│ ├─ .htaccess
│ ├─ build/
│ └─ index.php
├─ resources/
├─ routes/
├─ storage/
├─ vendor/
└─ .env
public/index.phpは、Laravelのリクエストを受け取る入口です。Laravel 13.xの標準ファイルでは、メンテナンスファイル、Composerのオートローダー、bootstrap/app.phpをプロジェクトルートから読み込みます。
そのため、Apacheの公開先をプロジェクトのルートディレクトリにするのではなく、publicへ向けるのが基本です。プロジェクトルートを公開先にすると、設定ファイルや依存パッケージがWebから見える構成になり得ます。
配置前にバージョンと起動状態を確認する
まず、Laravelプロジェクトのルートディレクトリで、CLIから利用しているPHPなどのバージョンを確認します。
php -v
composer --version
php artisan --version
node --version
npm --version
次に、Laravelの開発サーバーで画面を表示します。
php artisan serve
ブラウザでhttp://127.0.0.1:8000/を開き、Apacheへ切り替える前の基準となる画面を確認します。ここでLaravelが動作していない場合は、先にプロジェクトやデータベースの問題を解決します。
CLIのPHPとXAMPP Apacheが使うPHPは、別の実行ファイルになっていることがあります。例えば、CLIでは次のようにXAMPP付属のPHPを明示して確認できます。
C:\xampp\php\php.exe -v
ブラウザからApache経由でPHPの情報を確認する場合も、確認後は情報を公開したままにしないでください。公開環境へphpinfo()を残す方法は避けます。
VirtualHostを利用するパターン
Apacheの設定ファイルを変更できる場合は、VirtualHostを使ってpublicを直接DocumentRootにする構成が分かりやすいです。
例えば、プロジェクトを次の場所に置くとします。
C:\xampp\htdocs\laravel13
この場合、Apacheから公開するディレクトリは次の場所です。
C:\xampp\htdocs\laravel13\public
VirtualHostを設定する
C:\xampp\apache\conf\extra\httpd-vhosts.confを開き、プロジェクト用のVirtualHostを追加します。WindowsのApache設定では、パスの区切りにスラッシュを使うと扱いやすいです。
<VirtualHost *:80>
ServerName laravel13.test
DocumentRoot "C:/xampp/htdocs/laravel13/public"
<Directory "C:/xampp/htdocs/laravel13/public">
AllowOverride All
Require all granted
</Directory>
ErrorLog "logs/laravel13-error.log"
CustomLog "logs/laravel13-access.log" common
</VirtualHost>
AllowOverride Allは、Laravelのpublic/.htaccessを利用するための例です。実際の環境で許可するディレクティブを限定できる場合は、必要な範囲に絞ることも検討します。
なお、Apacheの80番ポートを別のプログラムが使用している場合は、VirtualHostのポートとアクセスURLをXAMPP Apacheの設定に合わせて変更します。
hostsファイルへホスト名を追加する
次に、管理者権限でメモ帳を起動し、Windowsのhostsファイルを開きます。
notepad C:\Windows\System32\drivers\etc\hosts
次の行を追加します。
127.0.0.1 laravel13.test
XAMPP Control PanelからApacheを再起動し、ブラウザでhttp://laravel13.test/を開きます。
画面が表示されたら、URLに/publicが含まれていないことを確認します。この構成では、Apacheの公開範囲が最初からpublicに限定されています。
VirtualHost方式の確認ポイント
- 想定したホスト名のVirtualHostが選択されているか
DocumentRootがLaravelのpublicを指しているかpublic/.htaccessが読み込まれているか- Laravelのルート、Blade画面、フォームが表示できるか
.envやプロジェクトルートのファイルへアクセスできないか- Apacheのアクセスログとエラーログに原因が出ていないか
プロジェクト配下の`.htaccess`を利用するパターン
VirtualHostを設定できない場合は、XAMPPのhtdocs配下にプロジェクトを置き、プロジェクト用の.htaccessでpublicへリライトする方法があります。
例えば、次のURLでアクセスする構成です。
C:\xampp\htdocs\laravel13
http://localhost/laravel13/
プロジェクトルートのC:\xampp\htdocs\laravel13\.htaccessに、次のような設定を記述します。
RewriteEngine On
# すでにpublic配下へ内部転送されたリクエストは再度処理しない
RewriteCond %{REQUEST_URI} !/public/ [NC]
RewriteRule ^(.*)$ public/$1 [L]
この例では、/laravel13/aboutへのアクセスを、プロジェクト内のpublic/aboutへ振り分けます。該当ファイルがなければ、public/.htaccessのフロントコントローラー処理によってLaravelへ渡されます。
ただし、サブディレクトリでのRewriteは、Apacheの設定やURLの構成によって挙動が変わります。実際のプロジェクトで、存在する静的ファイル、存在しないLaravelのルート、クエリ文字列、フォーム送信を確認してください。
`.htaccess`を有効にする
.htaccessへ記述しても何も起きない場合は、Apache側でAllowOverrideが無効になっている可能性があります。httpd.confのhtdocsに対応する<Directory>設定を確認します。
<Directory "C:/xampp/htdocs">
AllowOverride All
Require all granted
</Directory>
mod_rewriteが読み込まれていることも確認します。設定変更後はApacheを再起動し、エラーがある場合はApacheのerror.logを確認します。
プロジェクトルートを直接公開する構成になるため、次のURLも確認します。
http://localhost/laravel13/.envhttp://localhost/laravel13/vendor/http://localhost/laravel13/storage/http://localhost/laravel13/bootstrap/
これらで設定値やソースコードが表示される場合は、そのまま使わずに公開範囲とRewriteを見直します。VirtualHostを設定できる環境なら、プロジェクトルートを公開しないVirtualHost方式の方が管理しやすいかと思います。
public_html相当の公開ディレクトリへ配置するパターン
レンタルサーバーなどでは、Webから公開されるディレクトリがpublic_htmlに固定され、DocumentRootやVirtualHostを変更できないことがあります。この場合は、Laravelのpublicディレクトリの中身をpublic_htmlへ配置します。
重要なのは、publicディレクトリそのものではなく、publicの中にあるファイルとディレクトリを配置することです。
/home/example/
├─ laravel13/
│ ├─ app/
│ ├─ bootstrap/
│ ├─ storage/
│ ├─ vendor/
│ └─ .env
└─ public_html/
├─ .htaccess
├─ build/
└─ index.php
この例では、Laravelプロジェクト本体をlaravel13へ置き、公開対象だけをpublic_htmlへ置いています。.env、vendor、storage、bootstrap、resourcesなどはpublic_htmlへコピーしません。
publicの中身を配置する
Laravelプロジェクトのpublicにある、次のようなファイルとディレクトリをpublic_htmlへ配置します。
index.php.htaccessfavicon.icoや画像などの静的ファイルnpm run buildで生成したbuildディレクトリ
ファイルマネージャーやFTPを使う場合は、先頭がドットの.htaccessが表示・転送対象になっていることを確認します。publicディレクトリ自体をpublic_html/publicとして配置すると、URLやアセットのパスが想定と変わるため注意してください。
index.phpのパスを変更する
Laravel 13.xの標準的なpublic/index.phpでは、__DIR__ . '/../'を基準にプロジェクトルートを参照します。public_htmlとLaravelプロジェクトが同じ親ディレクトリにある場合は、../laravel13/を参照するよう変更します。
<?php
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
// メンテナンスモードの確認
if (file_exists($maintenance = __DIR__.'/../laravel13/storage/framework/maintenance.php')) {
require $maintenance;
}
// Composerのオートローダーを読み込む
require __DIR__.'/../laravel13/vendor/autoload.php';
// Laravelを起動してリクエストを処理する
/** @var Application $app */
$app = require_once __DIR__.'/../laravel13/bootstrap/app.php';
$app->handleRequest(Request::capture());
変更するのは、メンテナンスファイル、vendor/autoload.php、bootstrap/app.phpの参照先です。Laravelのバージョンやプロジェクトの配置によって標準ファイルの内容が異なる場合があるため、手元のpublic/index.phpを基準に変更します。
例えば、Laravelプロジェクトが/home/example/laravel13ではなく/home/example/apps/laravel13にある場合は、../apps/laravel13/など、実際の相対パスへ置き換えます。
public_html方式の確認ポイント
public_html/index.phpから3つの参照先へ到達できるか.envがpublic_html配下に存在しないか- Laravelのトップページと存在しないルートが表示できるか
- CSS、JavaScript、画像などの静的ファイルが読み込めるか
storageへ保存した公開ファイルを使う場合、public/storage相当のリンクを環境に合わせて用意できているか- Composer更新やViteビルド後に、必要なファイルを再配置したか
public/storageのシンボリックリンクは、環境によって作成方法が異なります。公開ディレクトリへstorage全体をコピーして解決しようとせず、Laravelのstorage:linkやサーバーの仕様を確認してください。
.envと書き込み先を確認する
ApacheからLaravelを動かす場合も、.envの設定値を確認します。例えば、アプリケーションURLやデータベース接続先が、Apacheからアクセスするときの環境と一致しているか確認します。
php artisan about --only=environment
設定キャッシュが残っていると、.envを変更しても画面へ反映されないことがあります。ローカル環境で設定を確認し直す場合は、必要に応じてキャッシュを削除します。
php artisan optimize:clear
本番環境で設定をキャッシュする場合は、キャッシュ後に.envが読み込まれなくなる条件もあります。設定キャッシュを利用する運用では、Laravel公式ドキュメントの説明を確認してください。
Laravelはstorageとbootstrap/cacheへ書き込む必要があります。WindowsのXAMPPでは、Apacheをサービスとして実行しているか、どのユーザーで実行しているかによって書き込み可否が変わることがあります。
500エラーが表示される場合は、Windowsのフォルダー権限を広く変更する前に、Laravelのstorage/logsとApacheのerror.logを確認します。
Viteのビルド成果物を確認する
Viteの開発サーバーを起動せず、Apacheから画面を表示する場合は、先にアセットをビルドします。
npm run build
ビルド後に生成されたpublic/buildなどのファイルが、Apacheの公開先へ存在することを確認します。Bladeで@viteを利用している場合、開発サーバーが起動していなければビルド済みのマニフェストとアセットが使われます。
VirtualHost方式ではプロジェクトのpublic/buildがそのまま公開されます。public_html方式では、ビルド後のpublicの内容をpublic_htmlへ再配置します。
画面は表示されるのにCSSやJavaScriptだけが読み込まれない場合は、ブラウザの開発者ツールで404になっているURLを確認し、Apacheの公開先とViteの生成先を照合します。
動作確認と切り分け
3つの方式で共通して、次の順番で確認すると原因を分けやすくなります。
- Apacheが起動しているか確認する。
- ブラウザでアクセスしているホスト名、ポート、パスを確認する。
- Apacheの公開先がLaravelの
public、またはその中身になっているか確認する。 index.phpからLaravel本体、Composer、Bootstrapを読み込めるか確認する。- LaravelのログとApacheのログを確認する。
- CSS、JavaScript、画像などの静的ファイルを個別に確認する。
| 症状 | 主な確認箇所 |
|---|---|
| Apacheが起動しない | 80番ポート、XAMPPのログ、他のWebサーバー |
| 404になる | VirtualHostの選択、URLのパス、Rewrite、Laravelのルート |
| 403になる | <Directory>、Require all granted、フォルダーのアクセス権 |
| 500になる | PHPのバージョン、拡張機能、index.phpのパス、LaravelとApacheのログ |
| CSSやJavaScriptが読み込まれない | npm run build、public/build、ブラウザのNetworkタブ |
| 画面から保存できない | .envの接続先、storage、bootstrap/cacheの書き込み |
3つの方式を比較する
| 方式 | 向いている環境 | 注意点 |
|---|---|---|
| VirtualHost | Apache設定を変更できるローカル環境 | publicをDocumentRootに指定する。hostsやVirtualHost設定が必要。 |
プロジェクト配下の.htaccess |
既存のhtdocs構成を残したい環境 |
AllowOverrideとmod_rewriteが必要。公開範囲を十分に確認する。 |
public_htmlへ配置 |
公開ディレクトリが固定されたサーバー | publicの中身だけを配置し、index.phpの3つの参照先を変更する。 |
Apacheの設定を管理できるなら、公開範囲を明確にしやすいVirtualHost方式が扱いやすいです。設定を変更できない場合は、環境の制約に合わせて.htaccess方式やpublic_html方式を選びます。
本番環境へそのまま適用しないための注意
- Laravelのプロジェクトルート全体をDocumentRootにしない。
.env、APIキー、パスワード、個人情報をWeb公開ディレクトリへ置かない。- ローカル確認で
APP_DEBUG=trueにした場合は、本番環境で必ず見直す。 - ApacheのアクセスログとLaravelのログへ、秘密情報を出力しない。
- WindowsのXAMPPで動作した設定を、Linuxの所有者・権限・PHP実行方式へそのまま読み替えない。
AllowOverride Allや広範囲のアクセス許可を、必要性を確認せずに本番へ適用しない。- 設定変更後はApacheを再起動し、不要になったVirtualHostやRewrite設定を整理する。
Laravel公式ドキュメントでも、Webサーバーの公開先をpublicへ向けること、storageとbootstrap/cacheへ書き込めること、運用環境ではデバッグ情報を公開しないことが案内されています。
まとめ
Laravel 13をXAMPPのApacheから動かす場合は、Laravelプロジェクトのルートではなく、publicをWeb公開の入口にします。
Apacheの設定を変更できる場合は、VirtualHostのDocumentRootをpublicへ向ける方法が基本です。既存のhtdocs構成を使う場合は、プロジェクト配下の.htaccessでpublicへ振り分ける方法があります。
公開ディレクトリがpublic_htmlなどに固定されている場合は、publicの中身だけを公開ディレクトリへ置き、index.phpからメンテナンスファイル、Composerのオートローダー、bootstrap/app.phpを実際のプロジェクトへ向けます。
方式を選んだ後は、PHPの実行環境、.env、書き込み先、Rewrite、Viteのビルド成果物、LaravelとApacheのログを順番に確認すると、開発サーバーでは動くのにApacheでは動かない問題を切り分けやすくなります。
参考資料
- Laravel 13.x Deployment
- Laravel 13.x Directory Structure
- Laravel 13.x Configuration
- Laravel 13.x Asset Bundling (Vite)
- Apache HTTP Server: Getting Started
- Apache HTTP Server: .htaccess files
- Apache HTTP Server: Configuration Files
- Apache HTTP Server: mod_rewrite Introduction
- Windows 11でLaravel 13を始める:環境構築からルーティング・Controller・Bladeまで
- Laravel 13のcomposer devでMailpit・キューワーカー・Viteをまとめて起動し、キュー化メールを確認する
- Laravel開発サーバーを同一LANのスマホから確認する手順
奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
Laravel 13+Vue.jsで登録・編集フォームを非同期化する:fetchとaxiosを比較
2026.08.26
Laravel 13のBlade画面にVue.jsを組み込み、membersテーブルのnameとemailを登録・編集するフォームを作ります。Vue.jsからLaravelのWebルートへJSONを送信し、CSRFトークン、バリデーションエラー、送信中・通信失敗の状態を扱います。リクエスト送信にはfetchとaxiosを使う方法を比較し、追加パッケージの有無やエラー処理の違いを整理します。
Laravelの開発サーバーを同一LANのスマホから確認する方法
2026.08.24
Laravelの開発サーバーをPCのLAN内IPアドレスで起動し、同じWi-Fiに接続したスマートフォンから画面を確認する手順を説明します。開発PCのIPアドレス確認、php artisan serveの待受設定、npm run build後のCSS・JavaScript確認、Windows Defender FirewallやWi-Fiルーターによって接続できない場合の切り分けを扱います。
Windows 11のLaravel 13でcomposer devにMailpitを追加し、キュー化したメールを確認する
2026.08.22
Windows 11のLaravel 13開発環境で、composer.jsonのdevスクリプトにMailpit、Laravel開発サーバー、キューワーカー、Viteを登録し、composer devからまとめて起動する方法を紹介します。データベースキューへ登録したテキストメールをMailpitで確認する流れに加え、php artisan devとの違い、MailpitのSMTP・Web UI設定、SQLiteファイルをGit管理から除外する方法、起動時の切り分けも説明します。
Laravel 13でBladeの新規登録フォームを作成する:バリデーション・CSRF・入力値の再表示
2026.08.21
Laravel 13のBladeで、既存のmembersテーブルへnameとemailを登録する新規登録フォームを作成します。$request->validate()による入力値の検証、@csrfによるCSRF対策、@errorによるエラー表示、old()による入力値の再表示、登録後のリダイレクトメッセージまでを確認します。