我的.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内部服务器错误,它显示Request exceeded the limit of 10 internal redirects due to probable configuration error
这是有道理的,因为mod_rewrite运行直到满足所有条件。
我应该如何更改我的重写以解决此问题?
答案 0 :(得分:0)
: RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+?)/?$ $1.php [L]
当您请求表单/api/logout
的网址时,您将收到重写循环(500错误),因为REQUEST_FILENAME
映射到<document-root>/api
(如果您追加.php
确实是一个有效的文件),但你最终在.php
指令中将/api/logout
附加到RewriteRule
(URL路径)(显然不是同一个东西)。然后将/api/logout.php
重写为/api/logout.php.php
等,重复将.php
附加到网址路径,同时始终检查/api.php
是否为有效文件。
如果您的所有文件都在文档根目录中,那么您可以将RewriteRule
模式更改为仅匹配第一个路径段。例如:
RewriteRule ^([^/]+) $1.php [L]
但是,如果您有不同目录深度的文件(您引用的文件没有.php
扩展名),那么您可能需要创建一些特定的规则/例外。
如果我转到
example.com/api.php/logout
,我会收到404错误。
如果已禁用附加路径名信息(PATH_INFO),则会产生404(尽管PHP文件通常默认启用它)。您可以在.htaccess
文件的顶部明确启用此功能:
AcceptPathInfo On