某レンタルサーバのサブディレクトリ配下に、Laravel 5.1 をインストールする必要がありました。
普通に composer等で Laravel をインストールすると、フォルダ構造は
/laravel # laravel本体
/laravel/public # ドキュメントルート
みたいな感じで、laravel本体の下の public フォルダが公開領域になるのですが、これだとレンタルサーバのサブディレクトリ配下にインストールするには都合がわるい。
たとえばこんな感じに public フォルダの場所を変更し、laravel本体と公開領域とは別階層に分けたい。
/laravel # laravel本体
/www/subfolder # ドキュメントルートのサブフォルダ
そのために作業したことまとめです。
とりあえず public を移動させる
/laravel/public
フォルダを /www/subfolder
などに移動させます。
index.php を修正
移動させた /www/subfolder/index.php
内を、 2ヶ所書き換えます。
/www/subfolder/index.php
// 変更前
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
// 変更後
require __DIR__.'/../../laravel/bootstrap/autoload.php';
$app = require_once __DIR__.'/../../laravel/bootstrap/app.php';
require のパスの修正をしているだけです。これで、ひとまず動作するようになります。
php artisan serve が動くようにする
ただ、まだこの状態では php artisan serve
コマンドが以下のようなエラーになります。
$ php artisan serve
[ErrorException]
chdir(): No such file or directory (errno 2)
なので php artisan serve
から参照される public フォルダの場所を変更したいのですが、Illuminate\Foundation\Application
内の publicPath()
メソッドでフォルダ名が直書きされていました。ということで、継承したクラスを新たに作ります。
laravel/app/Application.php
<?php
namespace App;
class Application extends \Illuminate\Foundation\Application
{
public function publicPath()
{
return dirname($this->basePath) . '/www/subfolder';
}
}
こんな感じで、新しくドキュメントルートを設定。
で、 laravel/bootstrap/app.php
の冒頭で読み込んでいる Application クラスを、新しく作ったものに変更します。
laravel/bootstrap/app.php
$app = new App\Application(
realpath(__DIR__.'/../')
);
server.php を修正
/laravel/server.php
内にもパスの指定がありますので、それを修正します。
/laravel/server.php
// 変更前
if ($uri !== '/' and file_exists(__DIR__.'/public'.$uri)) {
return false;
}
require_once __DIR__.'/public/index.php';
// 変更後
if ($uri !== '/' and file_exists(__DIR__.'/../www/subfolder'.$uri)) {
return false;
}
require_once __DIR__.'/../www/subfolder/index.php';
以上で動くようになりました。(Laravel 5.1.40 で確認)