PHPのマイクロフレームワークであるSlimが4にバージョンアップしたのは知っていたのですが、終ぞ今まで手を出せずにいました。
ようやくドキュメントを読み始め、そこで「サブディレクトリで使用する場合はどうするのだろうか?」と思ったのでメモしておきます。
……通常はルートディレクトリだと思いますが。
検索してみると、Slimのコアメンテナーの一人であるRob Allen氏のWebサイトがヒットしました。
……本当、Slimに関することならば公式ドキュメントかこのサイトを読めば事足りてしまうのではないでしょうか。
- URLが
https://example.com/で、対応するルートディレクトリが/var/www/htmlとする - SlimのアプリケーションのURLは
https://example.com/myappで、対応するディレクトリが/var/www/html/myappとする - Slim4の
index.phpが/var/www/html/myappにあるものとする
という条件のとき、Apacheの.htaccessとslim4の設定が以下、とのこと。
.htaccess
RewriteEngine On
RewriteBase /myapp
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
Slim 4 の設定
Slim 4 の設定としては、index.phpに以下の1行を加えるとのこと。
$app->setBasePath('/myapp');
さて、この.htaccessとSlim 4 の設定をもう少し具体的に見ていきたいと思います。
例えば、Slim-Skeletonの場合です。
Slim-Skeletonの場合、public/index.phpがアプリケーションの起点となるプログラムなので、イメージとしてはhttps://example.com/がWebサイト、https://example.com/publicがSlim 4 のアプリケーションにアクセスできるURL、という形でしょうか(これだとSlim 4 のapp/やsrc/といったファイルやディレクトリ群がルート直下に散らばるので汚くなってしまうので、実際はもう少し工夫したいところ……)。
ただ、この例ならばpublic/に.htaceessとindex.phpの両方が初めからあるのでそれらを書き換えて使うことができます。
public/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
# 略
# If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
# absolute physical path to the directory that contains this htaccess file.
# RewriteBase /
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [QSA,L]
RewriteBase /public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
</IfModule>
一番最初にRewriteEngine Onが記述されているので、</IfModule>直前の2行をコメントアウトしてサンプルのRewriteEngine Onより後の行を貼り付けます。
public/index.php
// 略
// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();
$app->setBasePath('/public'); // 追加
// 略
Slim 4 の設定の方は、$appが宣言されてルーティングする前ということで、$appがインスタンス化された直後辺りが良いのではないでしょうか。
この2ヶ所を書き換えた状態でhttps://example.com/publicにアクセスして、Slim-SkeletonのHello world!が表示されればOK。
これでサブディレクトリでも使用できることが確認できました。
……ただ、困ったことにsetBasePathメソッド、Slim 4 Documentation – Slim Frameworkで検索しても出てこないのですよね……ついでに日本語の情報も見当たりませんでした。