2

我正在为我的新 PHP 站点实现一个 MVC 模式,其 URL 结构如下:

example.com/module/controller/action?params=...

这是我的 .htaccess 文件:

Options -Indexes

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) portal.php?mvc=$1 [QSA,L]

这些规则大部分都正常工作,但是,如果我在公共空间中有一个与模块同名的目录,?mvc=[directory name]如果没有尾部斜杠,它会附加到 URL 的末尾。

例如:
example.loc/index变成example.loc/index/?mvc=index
example.loc/index/保持不变。

我怎样才能做到这一点,如果用户在example.loc/index其中输入的行为与包含结尾斜杠的行为相同?

4

2 回答 2

0

这是因为 mod_dir 的DirectorySlash指令干扰了您的重写。mod_dir 和 mod_rewrite 都位于同一个 URL 文件映射管道中,无论其他模块在做什么,它们都会做自己的事情。因此,当 mod_dir 认为请求是针对目录的,并且缺少尾部斜杠时,它将标记要重定向的 URL,但 URL 继续沿着 mod_rewrite 处理 URI 的处理管道。在该行的末尾,两个模块都修改了 URI ,并且URI 被标记为 301 重定向,因此对浏览器的响应是重定向到新的 URI(已被破坏)。

解决方案: 您需要处理 mod_rewrite 中的尾部斜杠或简单地关闭DirectorySlash(尽管您应该注意信息泄露安全警告)。您可以处理 mod_rewrite 中的尾部斜杠,例如:

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

确保在该RewriteEngine on行下方添加 *right。您需要在任何 MVC 路由发生之前应用它。

于 2012-10-01T21:26:29.060 回答
0

你需要 RewriteCond %{REQUEST_FILENAME} !-f 指令吗?我猜 Apache 会将 example.loc/index/ 视为文件系统中的文件夹而不是文件。

于 2012-10-01T21:30:24.797 回答