WebサーバにApacheを使っている場合の設定は、SlimのGitHubに極めてシンプルにまとめられています。
以下のように.htaccessに書いてね、とのことです。さっぱりとした説明ですな。
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L]
Slimのパッケージにもサンプルが付いてきます。
RewriteEngine Onとありますので、mod_rewriteを使うということがわかります。
むろん、.htaccessを使うので、ApacheにAllowOverrideの設定が必要になります。
まず、Apacheのconfファイルの設定は、エイリアスを切る場合だと、
Alias /runa-cca/ "/var/www/html/runa-cca/" <Directory "/var/www/html/runa-cca/"> AllowOverride All </Location>
のようになります。
.htaccessをどう書くかなのですが、以下のようにしました。
RewriteEngine On RewriteBase /runa-cca RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L]
「RewriteEngine On」は、Apacheでmod_rewriteを使うために必要です。
「RewriteBase /runa-cca」は、エイリアスを切っているので必要になります。URL書き換えのベースとなります。
実験してみたのですが、RewriteBaseが無いと、
Request exceeded the limit of 10 internal redirects due to probable configuration error.
というエラーがapache_error.logに出力されます。
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/runa-cca index.php [QSA,L]
と書くと、エラーは止まります。しかし、Runa-CCAのインデックスページ(/runa-cca/)からログインしたとき(/runa-cca/login)にファイルが見つからないと怒られます。
ということで、RewiteBaseは設定が必要。
「RewriteCond」と「RewriteRule」ですが、入り口としては「Apache mod_rewrite Introduction」のページが参考になります。わかりやすく説明されていました。私が使ったのはApache 2.2系列ですが、ドキュメントは新しい方がいいかなあと思って、2.4系列のURLをご紹介しております。
「RewriteCond」は「Apache Module mod_rewrite」を参照。細かく書いてあります。
「RewriteCond %{REQUEST_FILENAME} !-f」は、指定されたファイルが存在しない場合
「RewriteCond %{REQUEST_FILENAME} !-d」は、指定されたフォルダが存在しない場合
です。
Slimのサンプルに「!-d」が無い理由はわかりませんでした。私は付けておくことにしました。
「RewriteRule」は「RewriteRule Flags」を参照。これまた細かく書いてあります。
「RewriteRule ^ index.php [QSA,L]」は、すべてをindex.phpにまわせ、クエリーストリング(/pages/123?one=twoのone=two)は付けたままにしろ(QSA|qsappend)、書き換えルールはここでストーップ(L|last)という意味です。「^」の解釈に悩みましたが、「.*」にしても同じ動作でした。すべて、ということでしょう。
調べるの大変でした・・・。