我正在为我的新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
时具有相同的行为,就好像包含了结束斜杠一样?
发布于 2012-10-01 21:26:29
这是因为mod_dir的DirectorySlash
directive干扰了你的重写。mod_dir和mod_rewrite都位于同一个URL-file映射管道中,无论其他模块在做什么,它们都会做自己的事情。因此,当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
行的正下方。您需要在任何MVC路由发生之前应用此功能。
发布于 2012-10-01 21:30:25
是否需要RewriteCond %{REQUEST_FILENAME} !-f指令?我猜Apache会将example.loc/index/视为文件系统中的文件夹,而不是文件。
https://stackoverflow.com/questions/12681260
复制