全部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
文件位于文档根目录中。
$path
variables将包含假的目录结构,所以/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%!