全部redirect到index.php htaccess

我对这个话题的第1000000个问题表示歉意,但是我不能按照我想要的方式来工作。

我正在写一个简单的php mvc'ish框架。 我希望这个框架能够被安装在任何目录中。

我的PHP脚本是什么:抓住请求uri并将其分解成段。 使第1部分为控制器,第2部分为动作。 这一切都很好,当我这样做:

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

它将转到特定的模块控制器和方法。 现在我有一个默认的控制器,在家里的文件夹的家庭控制器。

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

如果我将该框架安装在不同的文件夹中,可以说文件夹框架,它必须redirect回http://www.domain.com/framework/index.php

我想将每个文件夹和php文件redirect到index.php,其他所有事情都是这样。

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

这是我试过的:

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

我真的希望有人能帮助我,或者指引我走向正确的方向!

非常感谢!!

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

首先确保.htaccess文件位于文档根目录(与index.php相同的位置),或者只影响它所在的​​子文件夹(以及其中的任何子文件夹 – recursion地)。

接下来对你的规则做一个小的修改,看起来像这样:

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

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

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

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

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


$pathvariables将包含假的目录结构,所以/mvc/module/test可以在index.php中使用,以确定您想要执行的Controller和操作。

旗帜:

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

L = Last(在重写之后它将停止重写,因此请确保它是重写列表中的最后一项)

QSA =查询stringApend,以防万一您想要保留并传递给index.php,您有?like=penguins东西。

要将不存在的所有内容redirect到index.php ,您还可以使用FallBackResource指令

 FallbackResource /index.php 

它与ErrorDocument工作方式相同,当你在服务器上请求一个不存在的path或文件时,这个指令默默地将请求索引到index.php

如果你想把所有东西( including existant files or folders )都redirect到index.php ,你可以使用如下的东西:

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

注意模式^((?!index\.php).+)$匹配除index.php之外的任何URI,我们排除了目标path以防止无限循环错误。

你可以使用这样的东西:

 RewriteEngine on RewriteRule ^.+$ /index.php [L] 

这会将每个查询redirect到根目录的index.php。 请注意,它也将redirect查询存在的文件,如图像,JavaScript文件或样式表。

愚蠢的答案,但如果你不知道为什么不redirect检查,以下是启用了Web文件夹..

AllowOverride All

这将使您能够运行必须运行的htaccess! (有替代品,但不会导致问题https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride

对于这个问题有一个“诀窍”适合所有情况,一个非常明显的解决scheme,你将不得不去尝试相信它实际上工作… 🙂

这里是…

 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,QSA] </IfModule> 

基本上, 当一个文件存在的时候 ,你总是要求MOD_REWRITE转发给index.php这个URI请求,而当请求的文件不存在的时候总是这样

当调查MOD-REWRITE的源代码来理解它是如何工作的时候,我意识到如果所引用的文件存在或不存在,所有的检查总是在validation之后进行。 只有这样才能处理RegEx 。 即使您的URI指向一个文件夹,Apache也会强制检查其configuration文件中列出的索引文件。

基于这个简单的发现,只要我们双击文件存在检查,并将两个结果路由到相同的端点,覆盖100%的可能性,明显的转变为简单的文件validation就足够了所有可能的调用

重要提示:注意index.php没有“ / ”。 默认情况下, MOD_REWRITE将使用它被设置为“基础文件夹”的文件夹进行转发。 它的美妙之处在于,它不一定需要成为站点的“根文件夹”,这个解决scheme适用于localhost/和/或任何您应用的子文件夹。

最终,我之前testing过的其他一些解决scheme(那些看起来工作正常的解决scheme)打破了PHP通过其相对path来“要求”文件的能力,这是一个无赖。 小心。

有些人可能会说这是一个不好的解决办法。 实际上,这可能是,但就testing而言,在几种情况下,几个服务器,几个不同的Apache版本等,这个解决scheme在所有情况下工作100%!