ちょっとサーバ立ち上げて、mod_rewrite を利用してURLを書き換えようとしたところApacheのエラーログに下記のようなエラーが出力された。

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

調べてみたら、どうやら mod_rewrite を利用した結果、永久ループを起こしている。

「.htaccess」に書いたのは、

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

RewriteEngine On
Rewrite機能のOn/Offを切り替える

RewriteCond
RewriteRuleの条件を設定、条件をクリアしたものだけにRewriteRuleを適用する。この場合、サーバ変数「REQUEST_FILENAME」が「!-f」であればRewriteRuleを適用するってことですね。

「!-f」って何や、「-f」はテスト演算子で、ファイルが存在したらってことで、その否定。ファイルが存在しなければルールを適用する。リクエストされたファイルが存在しなければルールを適用するよって事ですね。

RewriteRule
RewriteCondで指定した条件に一致した場合、適用する処理。上記の場合は、index.phpにアクセスするって事。

[QSA]フラグとは、RewriteRule前半にある正規表現でマッチした値をindex.phpの後に追加しますよって感じでいいのかな?で「L」フラグはルールの適用はここまでで終了って事でいいの?

なんかいろんなサイトを見ながら調査してんだが、つまり何か、リクエストで指定されたファイルが存在しなければindex.phpにアクセスしてくれって事なんだがrewriteの設定によりindex.phpにアクセスする際にも同様のルールが適用され永久ループに陥っているとの事か。なんでやねん!

なんとなく原因はわかったが解決策がわからん。 

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ web/ [QSA,L]
</IfModule>


できた!のか、まあいいや、試しながらやってく。何がしたかったかというとフレームワークでよく利用されているフロントコントローラーのシステムを本を見ながら作っているんですよ。

参考:パーフェクトPHP
なんかPHPに関してパーフェクトになりそうなんで買ってみた。