如何获得RewriteCond标志" -f"识别已经重写过的文件?

时间:2016-11-14 00:53:14

标签: php apache .htaccess mod-rewrite routes

我们目前正在将我们可怕的遗留PHP应用程序迁移到PHRoute - 它由大约一万或两万个顶级脚本组成。我们已经发布了一些孤立的页面,但现在我试图将它与整个系统集成。

我使用以下重写规则来排除任何现有文件和目录的重新路由,因此它不会尝试路由任何现有的顶级脚本。

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

这样可以正常工作,但有一个例外:对于多租户/自定义品牌推广,我们为客户特定文件(如徽标,CSS等)重写规则。路由器重写规则的条件不会取消重写了客户端文件,因此它尝试重新路由,例如,static/theme.css何时应该将其重写为/clients/[client]/css/theme.css并完全跳过路由器。

如何调整上述规则以将重写的文件作为"真实"档案(-f)?

1 个答案:

答案 0 :(得分:0)

原来我错过了客户端特定文件重写的[L][last]标志,这意味着路由器规则是针对原始URL(static/theme.css)而不是重写的一个(/clients/[client]/css/theme.css)。

添加L标志意味着它现在立即处理客户端重写而不是等到结束。因此,当它到达路由器时,它会重写它现在检查真实文件位置,从而成功识别真实文件。

来源:https://httpd.apache.org/docs/current/rewrite/flags.html#flag_l