例えば任意のフォルダ「/project/」に、Laravelで新規でプロジェクト作成すると、以下のようなフォルダが展開されます。
app bootstrap config database public resouces routes ...(略)
このうちフォルダ「public」が公開フォルダとなるので、ドキュメントルートに設定すればよいのですが、サーバ環境の都合上、別のフォルダを指定したい場合があります。
フレームワークであれば、1か所設定すれば解決しそうなお話ですが、Laravelではそうはいきません。
それでは、Laravel 5.8でデフォルトの公開フォルダ「/project/public/」を「/public_html/」に変更すると仮定して、設定手順を追ってみます。
ドキュメントルートの「index.php」を編集する
まず、ドキュメントルートに設置するインデックスファイル「/project/public/index.php」を「/public_html/index.php」に移動して編集します。
... require __DIR__.'/../vendor/autoload.php'; ... $app = require_once __DIR__.'/../bootstrap/app.php'; ...
上の記述部分を、以下のようにLaravel本体へのパスに調整します。
... require __DIR__.'/../../project/vendor/autoload.php'; ... $app = require_once __DIR__.'/../../project/bootstrap/app.php'; ...
一見、この対応だけでLaravelが問題なく動作しているように見えます。
但し、Laravelのコアなプログラムで「public」はハードコーディングされており、このままではストレージやファイルへのアクセスなど、公開フォルダへのアクセスが伴う処理をしようとするとズレが発生してしまいます。
例えばヘルパ関数「public_path()」を使用しても正しいパスは取得できません。
そこで、以下の対応も必要となります。
「app.php」を編集する
Laravel本体にハードコーディングされているパスを書き換えるため「/project/bootstrap/app.php」に以下の記述を追加します。
$app->bind('path.public', function () { return base_path('../public_html'); });
追記するのは最下行の「return $app;」の直前です。
これで「public_path()」を実行すると、期待した値が得られるはずです。
Laravelサーバ機能のドキュメントルートの変更
Laravelのサーバ機能コマンド「php artisan serve」を使う場合は「/project/server.php」を編集します。
以下の個所を、今回のドキュメントルートに変更します。
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { return false; } require_once __DIR__.'/public/index.php';
↓
if ($uri !== '/' && file_exists(__DIR__.'/../public_html'.$uri)) { return false; } require_once __DIR__.'/../public_html/index.php';
コメントする