Apache 与 Nginx 的 try_files 等效的是什么?

Apache 与 Nginx 的 try_files 等效的是什么?

在 Nginx 中有try_files,一个配置指令,用于“按顺序检查文件是否存在,并返回找到的第一个文件”。我觉得这样做非常好

location ~* \.(gif|jpe?g|css|js)$ {
    try_files $uri 404;
}

这是一种直接提供静态文件的安全方法,无需担心 Web 框架。如何在 Apache 中执行相同操作?

答案1

我通常看到使用 mod_rewrite 完成此操作:

 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
 RewriteRule ^/(.*)$ balancer://app_cluster%{REQUEST_URI} [P,QSA,L]

它的意思是“如果文件系统上不存在某个文件,则通过我的 mod_proxy_balancer 集群代理它。”否则,如果文件系统上存在该文件,则它只是由 Apache 根据DocumentRoot您的虚拟主机中的定义提供服务。

但这不是我最喜欢的方式,主要是因为stat每个请求都需要进行一次系统调用。

使用 mod_proxy,ProxyPassMatch如果你有足够新的 Apache 版本,你可以使用(查看文档)。 例如:

ProxyPassMatch \.(gif|jpe?g|css|js)$ !

使用 ! 来表示 Apache 应该不是与该正则表达式匹配的代理请求。

如果您使用的是旧版本的 Apache,您将可以使用该ProxyPass指令,但它仅匹配 URI 前缀(这是我当前首选的方法):

ProxyPass /images !
ProxyPass /stylesheets !

当然,如果您必须像上面提到的那样进行正则表达式匹配,那么您可以简单地修改我在顶部发布的 mod_rewrite 规则以否定对的匹配%{REQUEST_URI}

希望有帮助!

相关内容