为什么我的重写规则导致“400:错误请求”?

为什么我的重写规则导致“400:错误请求”?

我的站点配置中有以下重写规则:

RewriteEngine on
RewriteRule ^app.php - [L]
RewriteRule ^(.*)$ app.php$0 [L]

目标是所有请求都应附加到前端控制器“app.php”。规则的最后一行导致我的服务器响应“400:错误请求”,无论我尝试什么路径,即使是空路径。我已启用重写日志并尝试了两个路径:“/”和“/login”。日志内容如下:

(2)使用请求的 uri 初始化重写引擎 /
(3)将模式 '^app.php' 应用于 uri '/'
(3)将模式 '^(.*)$' 应用于 uri '/'
(2)重写 '/' -> 'app.php/'
(2)本地路径结果:app.php/
(2)使用请求的 uri /login 初始化重写引擎
(3)将模式 '^app.php' 应用于 uri '/login'
(3)将模式 '^(.*)$' 应用于 uri '/login'
(2)重写 '/login' -> 'app.php/login'
(2)本地路径结果:app.php/login

根据日志,它应该会成功。如果我删除重写规则的最后一行并访问 URL“app.php/login”,那么它就会按预期工作。

有人知道为什么这不起作用吗?


笔记:错误日志中没有错误。
笔记:当最后的重写规则被删除时,生成的路径(“app.php/”、“app.php/login”)可以完美运行。

答案1

我找到了答案。出于某种原因,我不得不在重写路径后附加一个“/”:

RewriteRule ^(.*)$ /app.php$0 [L]

否则,显然任何路径都会重写为:

example.comapp.php/

我有另一台具有相同 Apache 版本的服务器,但这种情况没有发生,所以我仍然感到困惑,但至少它可以工作。

相关内容