WEB/システム/IT技術ブログ

Laravelでドキュメントルート(公開フォルダ)「public」を変更する

例えば任意のフォルダ「/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';
B!

Comment

コメントはありません

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives