我在处理图像时遇到了一个小问题。我有一台前端服务器(site.com)和一台后端服务器(api.site.com),两者均由NFS存储器链接以获取图像。 原始图像存储在Back服务器中。 前端服务器仅获得Nginx和NodeJ 后台只有Nginx和PHP
当我要显示图像时:site.com/img/path-to-img-s250x250.jpg
,它将在NFS中搜索它,如果存在,它将被显示,如果不存在,则获取原始图像,调整其大小并将其保存在通过API服务器中的PHP脚本进行NFS。
您向我推荐的重写规则仅在我想通过API(api.site.com/img/path-to-img-s250x250.jpg
)显示图像时才有效,但是我需要通过前端(site.com/img/path-to-img-s250x250.jpg
)显示图像,你知道我怎么能做到这一点吗?
# site.com/img/prods/10002/filename-w200h200-bgF00.12345.jpg
location ~ "^/img/(.*)/([a-z0-9-]+)-w([0-9]+)h([0-9]+)(-bg([0-9A-Fa-f]{3,6}))?\.[0-9]{5}\.(jpg|jpeg|png|gif|ico|webp)$" {
try_files $uri /img/$1/$2-w$3h$4$5.$7 @redirect;
}
location @redirect {
proxy_pass http://api.site.com;
proxy_set_header X-ORIGIN http://api.site.com;
proxy_set_header X-Requested-With XMLHttpRequest;
}
答案 0 :(得分:0)
请参考上一个问题(How can I check if file exists in nginx? otherwise run a rewrite rule),您需要最终的重定向是外部的,而不是内部的。
您可以通过指定一个名为location
作为try_files
语句的最后一个参数来实现外部重定向。
例如:
location ~ "^/img/(.*/[a-z0-9]+-[0-9]+x[0-9]+)\.[0-9]{5}\.(jpg|jpeg|png|gif|ico)$" {
try_files $uri /img/$1.$2 @resize;
}
location @resize {
rewrite "^/img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+)\.[0-9]{5}\.(jpg|jpeg|png|gif|ico)$" https://api.example.com/image?path=$1&file=$2&ext=$5&w=$3&h=$4 redirect;
}