.htaccess在文件名上斜杠时返回500内部服务器错误

.htaccess在文件名上斜杠时返回500内部服务器错误,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我的.htaccess文件中有一个重写,因此不必看到example.com/login.php,而是看到example.com/login 以下是该文件中写入的内容: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+?)/?$ $1.php [L] 除了一件

我的.htaccess文件中有一个重写,因此不必看到
example.com/login.php
,而是看到
example.com/login

以下是该文件中写入的内容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
除了一件事之外,它工作得非常好:我正在创建一个名为
api.php
的文件,该文件将用作api。 我希望客户端转到
example.com/api/logout
example.com/api/auth
等,尽管
api
不是一个文件夹,而是一个PHP文件

问题是,每当我转到像
example.com/api/logout
(甚至
example.com/login/foo
)这样的文件时,我总是会收到500个内部服务器错误。如果我转到
example.com/api.php/logout
,我会得到一个404错误

我检查了500内部服务器错误的错误文件,它说由于可能的配置错误,
请求超过了10个内部重定向的限制,这是有道理的,因为mod_rewrite会一直运行到满足所有条件为止

我应该如何更改重写以修复此问题

当您请求
/api/logout
格式的URL时,您将得到一个重写循环(500个错误),因为
请求文件名
映射到
/api
(如果您附加
.php
确实是一个有效的文件),但您最终将
.php
附加到
/api/logout
(URL路径)在
RewriteRule
指令中(显然不是同一件事)
/api/logout.php
然后被重写为
/api/logout.php.php
等。重复将
.php
附加到URL路径,同时始终检查
/api.php
是否为有效文件

如果所有文件都在文档根目录中,则可以更改
重写规则
模式以仅匹配第一个路径段。例如:

RewriteRule ^([^/]+) $1.php [L]
但是,如果您有不同目录深度的文件(您正在引用的文件没有扩展名
.php
),那么您可能需要创建一些特定的规则/异常

如果我转到
example.com/api.php/logout
,我会得到一个404错误

如果其他路径名信息(PATH_INFO)被禁用(尽管PHP文件通常默认启用),这将导致404。您可以在
.htaccess
文件的顶部显式启用此选项:

AcceptPathInfo On
AcceptPathInfo On