ドキュメントルートをpublicにしないでLaravelを動かす方法

Laravel

通常、多くのWebフレームワークではpublicディレクトリをドキュメントルートにすることが求められます

Laravelも同様で、publicフォルダをドキュメントルートにする必要があります

ただし、多くのレンタルサーバの場合、簡単にドキュメントルートを変更できないので他の方法を考える必要があります

publicをつけないとアクセスできない

改めて問題点を整理します

|- html (サーバの公開フォルダ)
 |- bootstrap
 |- config
 |- database
 |- public ← ドキュメントルートにしたい
 |- resources
 |- routes
 |- storage
 |- tests
 |- .htaccess

htmlはレンタルサーバが指定する公開フォルダ

このように公開フォルダに全てのLaravelファイルをアップロードしてしまうと、ウェブのトップページにアクセスするには

「https://hoge.com/public

とアクセスしなくちゃいけないんです

今回紹介するのはドキュメントルートやファイル構成を変更することなく、これを、

「https://hoge.com」

というURLでアクセスできるようにする方法です

解決方法

|- html (サーバの公開フォルダ)
 |- bootstrap
 |- config
 |- database
 |- public
  |- .htaccess ← これじゃない
 |- resources
 |- routes
 |- storage
 |- tests
 |- .htaccess ← これ

ルートディレクトリに.htaccessという名前のファイルを作って、以下のコードをコピペします

<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>

publicディレクトリ配下にもデフォルトで.htaccessファイルが用意されてますが、これは編集しません

問題点

通常、レンタルサーバにファイルをアップロードすると、図のhtmlディレクトリ配下に設置されその中にあるファイルは全て公開フォルダ内にあります

普通なら実行ファイル(PHP)にはアクセスできないので問題ないはずですが、たぶん公開フォルダにあると外部から何らかの攻撃が可能になるのでしょう

僕はクラッカーじゃないので具体的な手法は知りませんが。

というわけで、この方法はあくまで個人的な趣味のウェブサイト程度ならいいかな、という手法です

「Laravelで試しにWebサイト作ってみたいけど、ドキュメントルートを変更するためにわざわざ違うサーバを契約するのはちょっと・・・」

という人向けです

企業や個人情報を扱うちゃんとしたウェブサイトでやるにはリスクが大きいので、ご注意を