🏞️
LaravelをApacheのDocumentRoot以外に配置する
はじめに
- 目的はLaravelをWebサーバ(Apache)のサブディレクトリで動作させます。
- DocumentRootをLaravelのpublicとはせずに、配下の別のサブディレクトリをLaravelのpublicに対応させます。
- 利用する機能はApacheのAliasとなります。
- これにより複数のLaravelを一個のApache上に配置できます。
- 特定のパス配下がLaravelとなり他の静的コンテンツと共存させます。
- ★注意★ Laravelのpublic以外のディレクトリは公開されるパスに配置してはならない。
Apacheの設定
- httpd.confやconf.d/*.confに記載します。
- VirtualHostの中でも設定可能です。
- laravelのrouteの記載はこのディレクトリをルートとした記載になります。
- 末尾の/が要調査、無いと期待と異なる動きをした。
/etc/httpd/conf/httpd.confや/etc/httpd/conf.d/*.conf
Alias /target1/ /var/project1/laravel/public/
<Directory "/var/project1/laravel/public/">
Options Includes ExecCGI FollowSymLinks
AllowOverride All
Require all granted
Order allow,deny
Allow from all
</Directory>
web.phpの例
web.phpの例
# Webサーバのフルパスでは/target1/
Route::get('/', function () {
return view('welcome');
});
# Webサーバのフルパスでは/target1/test1
Route::get('/test1', function () {
return view('test1');
});
# Webサーバのフルパスでは/target1/test2
Route::get('/path1/test2', function () {
return view('test2');
});
.htaccessの設定
- 各Laravelのpublic直下の.htaccessに次の設定を追加します。
RewriteBase サブディレクトリ
public/.htaccess
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
RewriteBase /target1/ # ★追加★
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} (.+)/$
# RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
注意点:jsやcssなどの記載方法
- アセットを使用すればlaravelのpublicをルートとした記載が可能
<link rel="stylesheet" href="{{ asset('/css/bootstrap.min.css') }}">
<script src="{{ asset('/js/jquery-3.1.1.min.js') }}"></script>
- アセットを使用しない場合はWebサーバのルートディレクトリからの記載になる
<link rel="stylesheet" href="/target1/css/bootstrap.min.css">
<script src="/target1/js/jquery-3.1.1.min.js"></script>
その他①
resource配下にbladeのテンプレートファイルが存在するのにFileNotFound例外によるエラー画面が出る場合はstrage配下のディレクトリに書き込み権限がないことが考えられます。
次のコマンドでApacheユーザからの参照と更新を許可します。
cd /var/project1/laravel/
chmod -R 777 storage/
その他②
Laravelが標準で作成するpublic/.htaccessでは/hoo/bar/でアクセスした際に、public/hoo/bar/ディレクトリが存在しない場合に、末尾の/を削って/hoo/barにリダイレクトを実施する設定となっています。
(このファイルがない場合はindex.phpへのアクセスとなる)
そのリダイレクトはTLS処理を行うリバースプロキシが前にいる場合、httpsからhttpへのリダイレクトになってしまうので無効化している。
リクエストURLの末尾/の有無の同一視はroute/web.phpの方でカバーする。
※以下のコメントアウトの部分
public/.htaccess
:
# Redirect Trailing Slashes If Not A Folder...
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} (.+)/$
# RewriteRule ^ %1 [L,R=301]
:
Discussion
のところ、 設定ディレクティブと同一行の末尾にコメントを書くとエラーになります