2017-09-26 9 views
2

私の.htaccessファイルには書き換えがあり、example.com/login.phpの代わりにexample.com/loginが表示されます。ここで.htaccessはファイル名にスラッシュを付けたときに500内部サーバーエラーを返します

は、そのファイルに書かれているものです。

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

それは一つのことを除いて完璧に動作します:私は、APIとして機能しますapi.phpというファイルを作成しています。 apiはPHPファイルではなく、とexample.com/api/authなどに行きたいです。

問題は、example.com/api/logout(またはexample.com/login/foo)のようなファイルにアクセスするたびに、常に500内部サーバーエラーが発生します。 example.com/api.php/logoutに行くと、404エラーが発生します。

500 Internal Server Errorのエラーファイルを確認したところ、すべての条件が満たされるまでmod_rewriteが実行されるため、Request exceeded the limit of 10 internal redirects due to probable configuration errorと表示されます。

これを修正するために書き換えを変更するにはどうすればよいですか?

答えて

0
: 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

フォーム/api/logoutのURLを要求すると、あなたは<document-root>/apiREQUEST_FILENAMEマップ(あなたが.phpを追加する場合は確かに有効なファイルである)ので、書き換えループ(500エラー)を取得しますが、あなたはRewriteRule指示文(明らかに同じものではない)の.php/api/logout(URLパス)を追加してしまいます。 /api/logout.phpは、/api/logout.php.phpなどに書き換えられ、/api.phpが有効なファイルであることを確認しながら、URLパスに.phpを繰り返し追加します。

すべてのファイルがドキュメントルートにある場合、RewriteRuleパターンを最初のパスセグメントにのみ一致させることができます。たとえば:あなたは(あなたが.php拡張子なしで参照されている)別のディレクトリの深さでファイルを持っている場合

RewriteRule ^([^/]+) $1.php [L] 

しかし、あなたは、いくつかの特定のルール/例外を作成する必要があるかもしれません。

example.com/api.php/logoutに行った場合、404エラーが発生します。

(それは通常、PHPファイル用にデフォルトで有効になっているが)これは無効にされている404 場合、追加のパス名情報(PATH_INFO)になります。 .htaccessファイルの上部に明示的に有効にすることができます。

AcceptPathInfo On 
関連する問題