質問: お世話になっております。 現在Apacheの設定を行っています。 CleanURLにするために、RewriteEngineを使用して実現しようとしています。 今回サーバーではPHPを使用しています。 httpd.confを編集し、以下の設定を登録して、サーバーを再起動済みです。 ``` ##### 中略 ##### RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php ``` まず、テストのために以下のようなURLにアクセスして、hoge.phpに接続できることを確認しました。 ** つぎにURLを少し変えて次のようにしてアクセスしました。 ** するとInternal Server Errorが発生しました。 サーバー上のssl_error_logを確認したところ、次のエラーが発生していました。 **Request exceeded the limit of 10 internal redirects due to probable configuration error.** エラーの内容を調べたところ、リダイレクトのループが発生してエラーが起こっているようです。 この現象を回避するためにはどのように設定を変更すればよいでしょうか? -----サーバーの環境----- CentOS 7.4 Apache 2.4.6(CentOS) PHP 7.1.16 -----以下試したこと----- 1)Rewrite設定を一度削除して、phpの拡張子付きでのみアクセスできるようにして問題のURLにアクセス →404エラーで問題なし 2)「RewriteBase /」を追加してみて問題のURLにアクセス →同じエラーが発生 3)phpファイルとして存在しないファイルに対して/を追加してアクセス(ex: ) →404エラーで問題なし 以上、よろしくお願いいたします。
回答: どうやら、RewriteCond の `%{REQUEST_FILENAME}` は、パスの最後の「/」(スラッシュ)や拡張子「.php」が省かれて、"(DocumentRoot)/hoge" と設定され、判定されるようです。 なので、ループしてしまう。 `%{REQUEST_URI}` で「パスの最後に「/」が無い場合」という条件をつけるといいのではないでしょうか。 ``` RewriteEngine on RewriteCond %{REQUEST_URI} !/$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php ```