首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >现有目录的RewriteRule追加查询

现有目录的RewriteRule追加查询
EN

Stack Overflow用户
提问于 2012-10-02 05:19:42
回答 2查看 78关注 0票数 2

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

代码语言:javascript
运行
复制
example.com/module/controller/action?params=...

这是我的.htaccess文件:

代码语言:javascript
运行
复制
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时具有相同的行为,就好像包含了结束斜杠一样?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-02 05: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中的尾部斜杠,如下所示:

代码语言:javascript
运行
复制
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

确保将*添加到RewriteEngine on行的正下方。您需要在任何MVC路由发生之前应用此功能。

票数 0
EN

Stack Overflow用户

发布于 2012-10-02 05:30:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12681260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档