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で検索しても出てこないのですよね……ついでに日本語の情報も見当たりませんでした。