🏞️

LaravelをApacheのDocumentRoot以外に配置する

2022/12/11に公開1

はじめに

  • 目的は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