Apache相当于Nginx的try_files是什么?


12

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

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

这是一种直接提供静态文件而又不影响网络框架的安全方法。我如何在Apache中做同样的事情?


1
您寻求的解决方案是什么?所选答案确实不符合我的用例。
窗格小报

Answers:


9

我通常会用mod_rewrite看到它:

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

这意味着“如果文件系统上不存在文件,则通过我的mod_proxy_balancer群集代理它。” 否则,如果文件存在于文件系统中,则相对于DocumentRoot您在virtualhost中定义的文件,Apache会简单地为其提供服务。

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

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

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

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

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

ProxyPass /images !
ProxyPass /stylesheets !

当然,如果您必须如上所述进行正则表达式匹配,则只需修改我在顶部发布的mod_rewrite规则即可取消与的匹配%{REQUEST_URI}

希望有帮助!


2
我认为“错误”方式更类似于try_files,因为它会检查文件是否存在。似乎没有办法做到这一点ProxyPass
phunehehe 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.