page_adsence

2010年7月13日火曜日

mod_rewriteが効かない

symfonyでrouting.ymlに記述しているにも関わらず、全然効いてない。
キャッシュかなと思ったけど、symfony ccしてみたけど直らない。
で、mod_rewriteがちゃんと効いてるかどうか確認してみたら、これが効いてなかった・・・。
AllowOverrideはちゃんと書いたのになんでだろうと思って、
httpd.confをよく見てみたら

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

になってた・・・。
Directoryは記述された階層で書いた設定が、それ以下のディレクトリ全体に反映される。
つまり今回の場合は全てのディレクトリでAllowOverrideは使えないよって状態になっていた。
前からこんなの書いてあったっけと思いつつもこのDirectoryの部分をコメントアウト。
apache再起動。

Internal Server Error

あれっと思ってエラーログを確認すると、

[Wed Jun 16 18:19:22 2010] [alert] [client 192.168.XXX.XXX] /path/to/directory/web/.htaccess: Option FollowSymLinks not allowed here

FollowSymLinksは有効になってないからだめってことみたい。
ちなみにFollowSymLinksとはシンボリックリンクが有る場合はそのリンク先の参照を許可するって設定。

$ vi web/.htaccess
Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
RewriteEngine On

# uncomment the following line, if you are having trouble
# getting no_script_name to work
#RewriteBase /

# we skip all files with .something
#RewriteCond %{REQUEST_URI} \..+$
#RewriteCond %{REQUEST_URI} !\.html$
#RewriteRule .* - [L]

# we check if the .html version is here (caching)
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f

# no, so we redirect to our front web controller
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

確かにsymfonyの初期状態で生成される.htaccessにはFollowSymLinksの指定が追加されている。
じゃあこれを消せば問題解決のはず。
$ vi web/.htaccess
Options +ExecCGI
以下略


で、アクセスしてみたら問題なかった。