【Laravel】エックスサーバで、ドメイン名でアクセスできるようにする

Laravelで開発してエックスサーバで公開する時、ドメイン名で公開するには、少し工夫が必要なようです。

例えば、

Laravelプロジェクトをエックスサーバの公開ディレクトリに置くと、

https://[ドメイン名]/[プロジェクト名]/public/

というアドレスになってしまう。
これを、

https://[ドメイン名]/

というアドレスでアクセスできるようにしたい。

前提

・Laravelプロジェクト本体は、公開ディレクトリには置かず、エックスサーバの非公開ディレクトリに置くことにします。

例えば、ディレクトリ構造はこんな感じ。

home/
 └ [サーバーID]/
    └[ドメイン名]/
       ├public_html(公開ディレクトリ)/ ←ここにアクセスしたら、
       │
       │
       └[プロジェクト名](非公開ディレクトリ)/
          └ public/ ←ここを参照させたい

問題点

・Laravelのindex.phpが「public」フォルダ内にある。
・エックスサーバの公開ディレクトリが固定されている。

方法1

シンボリックリンクと「.htaccess」ファイルを使った方法。

シンボリックリンクの作成

まず、以下のコマンドで、Laravelプロジェクトの「public」へのシンボリックリンクを「public_html」の中に作成します。

$ ln -s $HOME/[ドメイン名]/[プロジェクト名]/public $HOME/[ドメイン名]/public_html/public

これで、
https://[ドメイン名]/public/
というアドレスで公開できるようになりました。

余談・・・

$ ln -s $HOME/[ドメイン名]/[プロジェクト名]/public $HOME/[ドメイン名]/public_html

こうしたらいいんじゃね?って思うかもしれませんが、
実行すると、「public_html」は存在しています。と怒られます。
かと言って、「public_html」は削除する事ができません。

次に、
https://[ドメイン名]/ へのアクセスがあったら、
https://[ドメイン名]/public/ を参照させるようにします。

「.htaccess」ファイルの設置

中身は、こんな感じ。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [QSA,L]
</IfModule>

3行目で、ドメイン名にアクセスがあったら、「public」フォルダ内を参照するようにしています。

この.htaccessファイルを、「public_html」の中に置きます。

以上で、ドメイン名でアクセスできるようになります!

方法2

こちらは、もっと簡単♪

ファイルの移動

Laravelプロジェクトの「public」の中身を、
サーバの公開ディレクトリ「public_html」に、すべて移動します。

パスの書き換え

移動したindex.phpを開いて、2箇所を編集します。

require __DIR__.'/../vendor/autoload.php';
という行を
require __DIR__.'/../[プロジェクト名]/vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
という行を
$app = require_once __DIR__.'/../[プロジェクト名]/bootstrap/app.php';

パスは、index.phpファイルから見た、それぞれのファイルへのパスです。今回の場合なら、こんな感じ。

まとめ

いずれかの方法で、ドメイン名でのアクセスができるようになったと思います。
他のサーバ、例えば、さくらのレンタルサーバなどは、公開ディレクトリを決められるので、困らないと思いますが、エックスサーバの場合は、この方法しかないようです。