如何将前端图像代理到后端图像?

时间:2019-04-01 12:29:37

标签: php nginx url-rewriting

我在处理图像时遇到了一个小问题。我有一台前端服务器(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;
}

1 个答案:

答案 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;
}