所有请求都通过index.php,没有例外

时间:2015-09-17 18:25:09

标签: apache .htaccess mod-rewrite redirect url-rewriting

我已经看到了很多这个问题的好答案,例如Pretty URLs in PHP frameworks,但它们都明确地排除了现有的文件和目录,现有的.php文件,index.php文件本身和/或.css /.js/etc。我希望所有指向index.php文件,包括index.php文件,我可以在那里动态选择如何处理它,例如压缩和缩小css / js文件或404-ing大多数真正存在的文件。

我一直在尝试很多事情来完成各种不同的奇怪效果并查看其他答案以寻求帮助,但我尝试的方法总是存在问题。我发现的最接近的工作方法也是最简单的......

RewriteRule .* index.php?__path__=$0 [L]

然而,问题是当我转到现有文件夹而没有输入尾随/例如localhost/test它重定向到localhost/test/ - 如果服务器上不存在该目录,则不会执行此操作。这创造了服务器上实际存在的东西与我试图摆脱的URL重写之间的区别。

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

此外,由于奇怪,我找不到任何其他这样做的例子,这有什么大的缺点吗?我假设除了从启动PHP并执行任何必要的额外服务器负载之外,应该没有任何问题 - 哦,当然错误可能会破坏对托管所有内容的访问。我使用以下代码...

127.0.0.1/testa

1 个答案:

答案 0 :(得分:1)

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

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} ^$

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