Laravelのディレクトリの中身一式を普通にサーバーに設置した場合、アクセスするURLは”ドキュメントルートURL/public/”といったように、URLに”public”を含めなければアクセスが出来ません。
これは、Laravelのドキュメントルート(公開ディレクトリのルート)が”public”ディレクトリとなっているためです。
しかし、通常は”public”をURLに含めた状態で運用することは無いので、これを取り除く対応を行います。
対応方法として、ここでは下記3つのパターンを紹介します。
- ウェブサーバーの設定でドキュメントルートを設定する
- .htaccessを作成して設置する
- Laravelのディレクトリを移動してシンボリックリンクを張る
ウェブサーバーの設定でドキュメントルートを設定する
最も簡単かつ(セキュリティ的にも)安全な方法です。
レンタルサーバーによっては、ドメインのドキュメントルートをコントロールパネルから設定できる場合があります。
ルート権限のあるマネージドサーバーやVPSでは、ウェブサーバーの設定ファイルを編集することで、ドメインに対してドキュメントルートを設定することが出来ます。
例えば”example.com”のドキュメントルートが”/var/www/html”となっているならば、後者のディレクトリのパスをLaravelの”public”ディレクトリまでのパスに変更してやれば良いことになります。
下記は、Apacheの設定ファイルである”httpd.conf”の、ドキュメントルートに関する設定部分です。つまり、ここを変更すれば良いことになります。
DocumentRoot "/var/www/html"
これは、Laravelだけを運用する場合は問題ありませんが、そうでない場合はドメインごとにドキュメントルートを設定出来るバーチャルホストを使う方法があります。
<VirtualHost *:80>
DocumentRoot /var/www/html/laravel/public
ServerName laravel.example.com
</VirtualHost>
上記のように記述すると、ドメイン”laravel.example.com”で接続した場合はドキュメントルートとして”/var/www/html/laravel/public”が参照されるようになります。
.htaccessを作成して設置する
ドキュメントルートの設定変更が出来ない場合に検討する方法として最も楽であり、一般的なレンタルサーバーでも対処可能な方法です。
バージョンごとの対応方法
Laravel6.x~8.x
下記内容で.htaccessを作成してドキュメントルート(publicディレクトリ自体がある所)に配置します。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>
Laravel 9.x~
下記内容で.htaccessを作成してドキュメントルート(publicディレクトリ自体がある所)に配置します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/ [L]
</IfModule>
補足事項
一応懸念点としては、Laravelのシステムファイルも公開ディレクトリ下にあるので、それらが何かの不具合・脆弱性によって外部から参照されてしまうかもしれないという心配があることです。これに対処する場合、公開ディレクトリ外にシステムファイルを移動させることになりますが、それについては次項で説明します。
Laravelのディレクトリを移動してシンボリックリンクを張る
ウェブサーバーのドキュメントルート(公開ディレクトリ)直下には、Laravelの”public”ディレクトリの中身のみを配置し、ドキュメントルートと同じ階層に適当な名前(例として”laravel”)でディレクトリを作成して、Laravelの”public”ディレクトリ以外の全てを配置します。
[www]
|
|-[public_html]
| |-.htaccess
| |-index.php
| :
|
|-[laravel]
|-[app]
|-[bootstrap]
|-[config]
:
次に、ウェブサーバーにSSHで接続し、”ln”コマンドを使用してシンボリックリンクを作成します。オプション引数”-s”の後には、リンク元とリンク先の順に記述します。
下記はコマンド例ですが、一般的なレンタルサーバーであれば、ドキュメントルートまでの間にユーザー名となるディレクトリが存在するはずですので、”pwd”コマンドを使うなどして調べて下さい。
$ ln -s /var/www/laravel/public /var/www/public_html/