Apache 通过index.php的所有请求,无例外
我已经看到了很多关于这个问题的好答案,例如,但是它们都明确排除了现有的文件和目录、现有的.php文件、index.php文件本身和/或.css/.js/等等。我希望所有内容都指向index.php文件,包括index.php文件,在那里我可以选择如何动态处理它,例如压缩和缩小css/js文件或404压缩大多数实际存在的文件 我已经尝试了很多方法来完成这项工作,效果各异,也很奇怪,我也在寻找其他的答案来寻求帮助,但无论我尝试什么方法,都会遇到问题。我发现的最接近的工作方法也是最简单的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
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
的解释可能也不错。很高兴它奏效了。我在回答中加了一个解释。