Laravelのドキュメントルートからpublicを消す【Laravel】

公開日:

最終更新日:

Laravelのドキュメントルートからpublicを消す【Laravel】

Laravelをインストールした当初はhttp://ドメイン名/publicとなっていると思います。
特にこだわりがなければそのままでもいいのですが、特に意味のないディレクトリはできればなくしたいです。

今回はLaravelのドキュメントルートを変更する場合の変更方法や注意点について書いていこうと思います。

実際に行った環境としてはLaravel5.6を対象としていますが、もしかしたらディレクトリ構造が変わっている可能性もあるので、参考程度にご覧ください。

シンボリックリンクをはる

おそらくこれが一般的かつ一番実害がない方法です。
ただこの方法はレンタルサーバーだと実行できるサーバーと出来ないサーバーがあるので、この辺りは調べるしかないです。

ちなみに、私がよく運用しているエックスサーバーであればSSH接続ができるので、シンボリックリンクをはることができます。実際にやったことはありませんが・・・。

エックスサーバーのSSH接続についてはこちらを参照してください。
https://www.xserver.ne.jp/manual/man_server_ssh.php

SSHの設定と接続が確認できればあとはコマンドプロンプトにあれやこれやを記述するのですが、シンボリックリンクについてのことだけをいうと下記の記述だけでなんとかなるようです。

ln -s 実在しているディレクトリ(ファイル) シンボリックリンク名(代わりに表示したい名称)

スラッシュから始めるとルートからの絶対パスで登録されるようです。
ちなみに相対パスでも設定できるようなので、設定の際は注意しないと違うファイルにシンボリックリンクがはられてしまうことになります。

その際はunlinkというコマンドでシンボリックリンクの削除もできるみたいですが、注意するにこしたことはないです。

publicディレクトリの中をルートに移動させる

推奨はされていませんが、publicディレクトリの中を全てルート直下におくことでpublicを介さずに表示させることができます。
ちなみに私がいつも実施している方法でもあります。

インストール直後は.envファイル(環境設定ファイル)と同じ位置にpublicディレクトリがあるので、その中身を全て.envファイルと同じ位置に置きます。

public直下のファイル移動後は今まで繋がっていたhttp://ドメイン名/publicでは繋がらなくなります。
原因としては、移動させたindex.phpにLaravelを構成するファイル群のautoloadのパスが合わなくなるからです。

パスが合わなくて見れなくなるのであれば、パスを合わせてあげれば済む話なので
index.phpに記述されているrequire(require_onceも含む)の部分のパスを下記のように変更します。

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/

// require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/./vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

// $app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once __DIR__.'/./bootstrap/app.php';

このようにすればhttp://ドメイン名として閲覧が可能になります。

特に解説は必要ないと思いますが、先ほどまでpublic内にindex.phpがあったので上の階層を参照するために「/../」としていましたが、同階層を参照するように「/./」としただけの話です。

私はルート直下にファイルが大量にあるのが好きではないので、極力必要のないファイルは消しておいてpublicより上の階層に設置してあったものを「project」というディレクトリにまとめたりして対応しています。
もちろんディレクトリを挟むということはパスの変更も必要になるので、環境に合わせて上記の部分を変更してください。

まとめ

今回紹介した方法は2通りでしたが、他にも調べてみると.htaccessでルート直下に表示することもできるようです。
ただ、こちらの環境ではうまくいかなかったので、もっと調べてコードを理解してから試してみる必要がありそうでした。

ひとまず、手っ取り早くルート階層を表示させる場合であればpublic直下のファイル群を移動させてindex.phpを書き換えるのが早いのではないかと思います。

本来であればシンボリックリンクを反映させる方がいいですが、サーバーによって限られていたり、案件次第でサーバー関連の操作をできるできないがあると思います。

状況によって使い分けてみてください。

関連記事