你的重写规则看起来几乎没问题。
首先确保您的.htaccess
文件位于您的文档根目录中(与index.php
)或者它只会影响它所在的子文件夹(以及其中的任何子文件夹 - 递归地)。
接下来对您的规则稍作更改,使其看起来像这样:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]
此刻你刚刚匹配.
这是one任何字符的实例,你至少需要.*
匹配任何字符的任意数量的实例。
The $_GET['path']
变量将包含假目录结构,所以/mvc/module/test
例如,您可以在 index.php 中使用它来确定控制器以及您想要执行的操作。
如果你想将整个shebang安装在一个子目录中,例如/mvc/
or /framework/
最简单的方法是稍微改变重写规则以考虑到这一点。
RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]
并确保您的index.php
位于该文件夹中,同时.htaccess
文件位于文档根目录中。
替代$_GET['path']
(更新于 2018 年 2 月和 19 年 1 月)
实际上没有必要(现在甚至不常见)设置path as a $_GET
变量,许多框架都会依赖$_SERVER['REQUEST_URI']
检索相同的信息 - 通常是为了确定哪个控制器使用——但原理是完全一样的。
这确实简化了RewriteRule
稍微因为你不需要创建path参数(这意味着OP的原始RewriteRule
will现在工作):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]
However,有关安装在子目录中的规则仍然适用,例如
RewriteRule ^.*$ /mvc/index.php [L,QSA]
标志:
NC
= 不区分大小写(不区分大小写,并不是真正必要,因为模式中没有字符)
L
= 最后(它将在此重写之后停止重写,因此请确保它是重写列表中的最后一件事)
QSA
= 查询字符串追加,以防万一你有类似的东西?like=penguins
在您想要保留并传递给index.php 的末尾。