我如何获得rewritecsecond标志"-f"识别已经重写的文件


How can I get the RewriteCond flag "-f" to recognise already-rewritten files?

我们目前正在将我们庞大的遗留PHP应用程序迁移到PHRoute -它由大约一万个顶级脚本组成。我们对几个孤立的页面进行了拦截,但现在我正试图将其与整个系统集成。

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

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

这工作得很好,但有一个例外:对于多租户/自定义品牌的原因,我们重写了客户端特定文件的规则,如徽标,CSS等。路由器重写规则的条件不拾取重写的客户端文件,因此它尝试重路由,例如,当它应该重写为/clients/[client]/css/theme.css并完全跳过路由器时,它会重新路由static/theme.css

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

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

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

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