Apache 通过index.php的所有请求,无例外

Apache 通过index.php的所有请求,无例外,apache,.htaccess,mod-rewrite,redirect,url-rewriting,Apache,.htaccess,Mod Rewrite,Redirect,Url Rewriting,我已经看到了很多关于这个问题的好答案,例如,但是它们都明确排除了现有的文件和目录、现有的.php文件、index.php文件本身和/或.css/.js/等等。我希望所有内容都指向index.php文件,包括index.php文件,在那里我可以选择如何动态处理它,例如压缩和缩小css/js文件或404压缩大多数实际存在的文件 我已经尝试了很多方法来完成这项工作,效果各异,也很奇怪,我也在寻找其他的答案来寻求帮助,但无论我尝试什么方法,都会遇到问题。我发现的最接近的工作方法也是最简单的 Rewrit

我已经看到了很多关于这个问题的好答案,例如,但是它们都明确排除了现有的文件和目录、现有的.php文件、index.php文件本身和/或.css/.js/等等。我希望所有内容都指向index.php文件,包括index.php文件,在那里我可以选择如何动态处理它,例如压缩和缩小css/js文件或404压缩大多数实际存在的文件

我已经尝试了很多方法来完成这项工作,效果各异,也很奇怪,我也在寻找其他的答案来寻求帮助,但无论我尝试什么方法,都会遇到问题。我发现的最接近的工作方法也是最简单的

RewriteRule .* index.php?__path__=$0 [L]
但是,问题是,当我转到一个现有文件夹时,如果没有输入尾随/e.g.
localhost/test
,它会重定向到
localhost/test/
——如果服务器上不存在该目录,则不会这样做。这就造成了服务器上实际存在的东西和我正试图摆脱的URL重写之间的区别

更奇怪的是,如果我转到
127.0.0.1/test
(如果某些DNS缓存怪癖导致此问题,这可能是一个修复),它会重定向到
http://127.0.0.1/test/?__path__=test
,这非常奇怪(特别是因为转到
127.0.0.1/test/
完全避免了预期的重定向,而且没有
[R]
是在重写中指定的),并显示了我正试图破坏的那种查询字符串URL
/var=value
为查询字符串提供了更好的格式,但我离题了。当然,重定向不会发生在
127.0.0.1/testa上,因为该文件不存在,所以Apache似乎只是有意做了一些我真的不想做的事情


另外,由于这很奇怪,我找不到其他这样做的例子,这有什么大的缺点吗?我假设,除了启动PHP和执行它必须执行的任何操作所带来的少量额外服务器负载之外,不应该存在任何问题——哦,当然,错误可能会破坏对所有托管内容的访问。我正在使用以下代码

// trying to access a file directly?
if ($is_file) {
    // TODO: manage served files (gzip, minify, etc.)
    // is it an allowed extension?
    if (!is_array($CONFIG['allow_ext_access']) || !in_array($type, $CONFIG['allow_ext_access']))
        die('access denied');
    // it's not *this* file is it?
    if (!$is_index) {
        // try to get known file type
        $file_type = isset($CONFIG['file_types'][$type]) ? $CONFIG['file_types'][$type] : false;
        // if we have a file type we can properly pass it as what it is
        if ($file_type) {
            header('Content-Type: '.$file_type['mime']);
        }
        // execute php file or just output any other file
        if ($type == 'php') @include($path);
        else @readfile($path);
        die;
    }
}
// if it's not this file, then it's a path and a URL for re-routing

如果我理解正确,您可以使用:

DirectorySlash Off
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule .* index.php?__path__=$0 [L,QSA]
DirectorySlash Off
用于禁用在实际目录后添加尾随斜杠,因为我们正在将所有内容(包括现有文件/目录)路由到
index.php

请确保在清除浏览器缓存后对其进行测试

我们在这里使用
ENV:REDIRECT_STATUS
变量,它是一个内部
mod_rewrite
变量,在成功的内部重写后设置为
200
。通过检查

RewriteCond %{ENV:REDIRECT_STATUS} ^$

我们正在确保只进行第一次重写,并且没有循环。

现有文件夹的apache自动尾随斜杠有什么问题?你想要什么?另外,您得到
http://127.0.0.1/test/?__path__=test
例如,这是一种正常行为,因为您的规则在任何时候都匹配所有内容。您需要为
index.php
添加一个异常,以避免loop@JustinIurman,如果我为
index.php
添加了一个异常,那么我的
index.php
不知道它需要尝试查找一个名为
index.php
的文件,如果根目录被访问,我不希望它这样做,因为
index.php
不是“there”。为现有文件夹添加尾部斜杠意味着,如果碰巧有一个名为“contact”的文件夹,就不能创建名为“contact”的页面“通过
/contact
访问。我根本不想要重定向,一切都应该转到
index.php
,它将以任何明确定义的方式处理请求。很好,缓存确实使旧路径仍然重定向,但我有大量未缓存的测试目录可用,谢谢。我终于有了唯一需要的访问权限。关于
ENV:REDIRECT\u STATUS
的解释可能也不错。很高兴它奏效了。我在回答中加了一个解释。