当对文件名进行斜杠时,.htaccess会返回500内部服务器错误

时间:2017-09-26 17:47:26

标签: .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]

除了一件事之外它完美无缺:我正在创建一个名为api.php的文件,它将作为api。 我希望客户转到example.com/api/logoutexample.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运行直到满足所有条件。

我应该如何更改我的重写以解决此问题?

1 个答案:

答案 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