微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用htaccess将all重定向到index.php

我正在编写一个简单的基于PHP的MVC-ish框架.我希望这个框架能够安装在任何目录中.

我的PHP脚本抓取请求uri并将其分解为段.它使段1成为控制器,段2成为行动.当我这样做时,这一切都很好:

http://www.example.com/mvc/module/test/

它将转到特定的模块控制器和方法.现在我有一个认控制器,即家庭控制器,它位于文件夹主页中.

现在我直接访问这个文件http://www.example.com/mvc/home/
它将显示403禁止,因为该文件夹确实存在,而且它也应该返回到http://www.example.com/mvc/index.php

如果我将框架安装在不同的文件夹中,让我们说文件夹框架必须重定向http://www.example.com/framework/index.php

我想将每个文件夹和PHP文件重定向回index.PHP,保留其他所有内容.

我遇到的第一个问题是它永远不会重定向到正确的文件夹,总是重定向到域根文件夹.

这是我试过的:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.PHP [L]

解决方法:

你的重写规则看起来几乎没问题.

首先确保您的.htaccess文件位于文档根目录(与index.PHP相同的位置),否则它只会影响它所在的​​子文件夹(以及其中的任何子文件夹 – 递归).

接下来对您的规则稍作修改,使其看起来像:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$/index.PHP?path=$1 [NC,L,QSA]

目前你只是匹配.这是任何字符的一个实例,至少需要.*来匹配任何字符的任意数量的实例.

$_GET [‘path’]变量将包含伪目录结构,例如/ mvc / module / test,然后您可以在index.PHP中使用它来确定您想要执行的Controller和操作.

如果你想将整个shebang安装在一个子目录中,比如/ mvc /或/ framework /,那么最简单的方法是稍微改变重写规则以将其考虑在内.

RewriteRule ^(.*)$/mvc/index.PHP?path=$1 [NC,L,QSA]

并确保index.PHP位于该文件夹中,而.htaccess文件位于文档根目录中.

$_GET [‘path’]的替代品(18年2月更新和19年1月更新)

实际上并不需要(现在甚至不常见)将路径设置为$_GET变量,许多框架将依赖$_SERVER [‘REQUEST_URI’]来检索相同的信息 – 通常用于确定使用哪个Controller – 但原则是完全相同的.

这确实简化了RewriteRule,因为您不需要创建path参数(这意味着OP的原始RewriteRule现在可以工作):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$/index.PHP [L,QSA]

但是,关于在子​​目录中安装的规则仍然适用,例如,

RewriteRule ^.*$/mvc/index.PHP [L,QSA]

旗帜:

NC =无大小写(不区分大小写,因为模式中没有字符,所以不是必需的)

L = Last(在重写之后它会停止重写,所以请确保它是重写列表中的最后一个)

QSA =查询字符串附加,以防你有类似的东西?喜欢=你想要保留的penguins并传递给index.PHP.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐