我有一个程序,可以创建上传到/images/
网络服务器上文件夹的图片的优化版本。它遍历子文件夹,并在每个子文件夹中创建一个.optimized
包含优化版本的文件夹,如果它至少比原始版本小一定大小。我的目标是检查是否存在这样的优化版本,如果存在则提供该版本,否则提供原始版本(在某种意义上,就像gzip_static
如果存在文件,如何提供 .gz 版本一样)。
我在 Apache 前面运行 NGINX 作为代理,因此虽然我习惯使用 htaccess 处理此类问题,但我尝试在 NGINX 中本地执行此操作,以避免服务器必须将请求移交给 Apache。在 中.htaccess
,我可以执行以下操作:
RewriteCond %{REQUEST_FILENAME} ^(/images/(?:.*/)?)(.*?)$ [OR]
RewriteCond $1.optimized/$2 -f
RewriteRule .* $1/.optimized/$2 [L]
有没有好的办法直接在 NGINX 中处理这个问题?我发现大多数类似的用例都是将所有缓存/优化的文件保存在一个缓存文件夹中,而不是我描述的结构。
答案1
您可以使用正则表达式location
提取 URI 的第一部分和第二部分。使用try_files
陈述按顺序搜索文件系统中的每个文件。
例如:
location ~ ^(/images/.*?)([^/]+)$ {
try_files $1.optimized/$2 $1$2 =404;
}