Apache 相当于 Nginx 的 try_files 是什么?

phu*_*ehe 15 nginx apache-2.2

在 Nginx 中有try_files一个 config 指令,它“按顺序检查文件是否存在,并返回找到的第一个文件”。我觉得这样做很巧妙

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

这是一种直接提供静态文件的安全方式,无需打扰 Web 框架。我怎样才能在 Apache 中做同样的事情?

loo*_*ver 10

我通常看到这是用 mod_rewrite 完成的:

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

这意味着“如果文件系统上不存在文件,则通过我的 mod_proxy_balancer 集群代理它。” 否则,如果该文件存在于文件系统中,则它只是由 Apache 提供,相对于DocumentRoot您的虚拟主机中定义的。

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

ProxyPassMatch如果您有足够新的 Apache 版本,则可以使用 mod_proxy (请参阅文档)。如:

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

哪个使用 ! 指示阿帕奇应该匹配的正则表达式的代理请求。

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

ProxyPass /images !
ProxyPass /stylesheets !
Run Code Online (Sandbox Code Playgroud)

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

希望有帮助!

  • 我认为“坏”方式更类似于`try_files`,因为它检查文件的存在。不过,似乎没有办法为“ProxyPass”做到这一点。 (2认同)