使用 htaccess 将所有重定向到索引.php

2022-08-30 06:40:52

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

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

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

它将转到特定的模块控制器和方法。现在我有一个默认控制器,主控制器,它位于文件夹主目录。

现在,当我直接访问此文件夹时,它将显示一个,因为此文件夹确实存在,相反,它也应该返回到http://www.example.com/mvc/home/403 forbiddenhttp://www.example.com/mvc/index.php

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

我想将每个文件夹和php文件重定向回索引.php,让其他所有内容保持原样。

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

这就是我尝试过的:

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

答案 1

您的重写规则看起来差不多没问题。

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

接下来,对规则稍作更改,使其如下所示:

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

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

该变量将包含假目录结构,例如,您可以在索引中使用该结构.php来确定控制器和要执行的操作。$_GET['path']/mvc/module/test


如果你想将整个shebang安装在子目录中,例如或最不复杂的方法是稍微改变重写规则以考虑到这一点。/mvc//framework/

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

并确保您在该文件夹中,而文件位于文档根目录中。index.php.htaccess


$_GET['path'] 的替代方案(2018 年 2 月和 2019 年 1 月更新)

实际上没有必要(甚至现在也不常见)将路径设置为变量,许多框架将依靠来检索相同的信息 - 通常用于确定使用哪个控制器 - 但原理完全相同。$_GET$_SERVER['REQUEST_URI']

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

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

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

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



标志:

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

L=最后(它将在这次重写后停止重写,因此请确保它是重写列表中的最后一件事)

QSA=查询字符串追加,以防万一您在末尾有想要保留并传递给索引.php之类的东西。?like=penguins


答案 2

若要将不存在的所有内容重定向到 ,还可以使用 FallBackResource 指令index.php

FallbackResource /index.php

它的工作方式与 相同,当您请求服务器上不存在的路径或文件时,该指令会以静默方式将请求发送给 。ErrorDocumentindex.php

如果要将所有内容 ( ) 重定向到 ,可以使用如下所示的内容:including existant files or foldersindex.php

RewriteEngine on

RewriteRule ^((?!index\.php).+)$ /index.php [L]

请注意,该模式与任何 uri 匹配,除非我们排除了目标路径以防止无限循环错误。^((?!index\.php).+)$index.php


推荐