MAC::Apacheのmod_rewriteを使おうとしてはまった
rewrite機能はURLを正規表現で変換して処理してくれる便利な機能だ。
例えば本来は/sample/index.php?key=abcなのを/sample/abc/などと静的なURLでアクセス可能にできる。
製作中のサイトでこれを使おうとしたが、なかなか動かずはまった。
/Users/username/Sites/exampleに.htaccessを置いて
RewriteEngine On
RewriteRule sample/([0-9]{3})/ sample/page.php?index=$1 [L]
と記述してhttp://example.localhost/sample/001/にアクセスしたが404エラーになってしまう。ページが存在しないということだが、もちろんsample/page.phpは事前に作成して$_GET['index']の値を使って動的に処理をするPHPを書いてある。MAC::ApacheのVirtual Hostを設定でhttp://example.localhost/へアクセスできるようにもしてある。
(1) まずApacehのconfファイルでmod_rewriteが読み込まれていないことを疑ってみた。
confファイルを参照してみた。
sudo less /etc/apache2/httpd.conf
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
の記述がありコメントアウトされたりはしていない。
(2) 次にexample.localhostのconfファイルで.htaccessが使えるようになっていないことを疑ってみた。
sudo vi /etc/apache2/other/example.localhost.conf
DirectoryセクションでAllowOverrideを有効にしている必要があるが書いていなかったので書き足した。
<Directory "/Users/usename/Sites/example">
Order allow,deny
Allow from all
</Directory>
↓ 追記
<Directory "/Users/usename/Sites/example">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
でApacheを再起動してconfファイルを読み込み。
sudo apachectl restart
http://example.localhost/sample/001/にアクセスすると今度は404エラーではなく403エラーとなった。とりあえずURLの存在は認識された!でもアクセスする権限がないとのこと。どうしたものか・・・
(3) ググってみると.htaccessのファイル属性によってこのようになることがあるとのこと。ファイルの属性を確認してみた。
ls -al ~/Sites/example
.htaccessは-rw-r--r--となっている。数値で表すと644だが、644なら動くはずらしい。
どうしたものか・・・
(4) さらにググってみるとconfファイルのDirectoryセクションにOptionsディレクティブでFollowSymLinksを設定していなければならない場合があるとの情報を発見!
sudo vi /etc/apache2/other/example.localhost.conf
<Directory "/Users/usename/Sites/example">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
↓ 追記
<Directory "/Users/usename/Sites/example">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
またApacheを再起動してconfファイルを読み込み。
sudo apachectl restart
http://example.localhost/sample/001/にアクセスすると今度はページが表示された!
あー疲れた。