43715


お世話になっております。

現在Apacheの設定を行っています。  
CleanURLにするために、RewriteEngineを使用して実現しようとしています。  
今回サーバーではPHPを使用しています。

httpd.confを編集し、以下の設定を登録して、サーバーを再起動済みです。

[code]

    <Directory "/var/www/html">
        ##### 中略 #####
    
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME}.php -f
        RewriteRule ^(.*)$ $1.php
    </Directory>
    
[/code]

まず、テストのために以下のようなURLにアクセスして、hoge.phpに接続できることを確認しました。  
_<https://domain/hoge>_

つぎにURLを少し変えて次のようにしてアクセスしました。  
_<https://domain/hoge/>_

すると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: <https://domain/piyo/>)  
→404エラーで問題なし

以上、よろしくお願いいたします。


CC BY-SA 3.0
2018-05-01T11:01:35.950
43699
2018-05-02T04:37:09.990
2018-05-02T00:14:45.563
3060
17014
question
apache
Apache RewriteEngineでRequest exceeded the limit...エラー


以前、似た状況に遭遇しました。  
おそらく `hoge` というファイルが存在しているのではないでしょうか。

mod_rewrite の状況が次のようになっていて、

[code]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.*)$ $1.php
    
[/code]

かつ、ファイル `hoge.php` と `hoge` が同時に存在するときに <http://domain/hoge/>
にアクセスすると、リダイレクトが次のようにループします。  
httpd.conf で LogLevel を debug にすると確認できます。

[code]

    /hoge/
    /hoge/.php
    /hoge/.php.php
    /hoge/.php.php.php
    ......
    
[/code]

なぜこうなるのかは理解できません。すみません。

解決方法としては、設定を次のように変更すれば意図通りに動くはずです。

[code]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ $1.php
    
[/code]

`hoge` と `hoge.php` が存在する状況で <http://domain/hoge> にアクセスした時、変更前の設定では `hoge.php`
が返却されるのに対し、変更後の設定では `hoge` が返却されます。  
この挙動の差が問題になることは無いと思いますが、念のため追記させてください。


CC BY-SA 4.0
2018-05-01T17:52:53.030
43706
2018-05-02T04:37:09.990
2018-05-02T04:37:09.990
28340
28340
43699
answer


どうやら、RewriteCond の `%{REQUEST_FILENAME}`
は、パスの最後の「/」(スラッシュ)や拡張子「.php」が省かれて、"(DocumentRoot)/hoge" と設定され、判定されるようです。  
なので、ループしてしまう。  
`%{REQUEST_URI}` で「パスの最後に「/」が無い場合」という条件をつけるといいのではないでしょうか。

[code]

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !/$
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.*)$ $1.php
    
[/code]


CC BY-SA 4.0
2018-05-02T02:31:59.333
43715
2018-05-02T02:31:59.333
4603
43699
answer