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/にアクセスすると今度はページが表示された!

あー疲れた。