Nginx - 如果“别名”失败,则向Server-App转发请求

时间:2017-06-07 18:41:30

标签: nginx reverse-proxy

对于一个项目,我实现了自动服务器端缩略图生成。如果您在其文件名中请求带有“_thumb”的图像,则服务器会检查原始图像是否已有缩略图,如果没有,则会生成并将其发回。工作正常。

现在我想将Nginx混合起来直接从硬盘驱动器提供图像而不涉及服务器应用程序(如果从服务器应用程序本身请求,则URL本身可以正常工作并返回图像)。 / p>

如果缩略图已存在,则以下块可正常工作。如果没有已经生成的缩略图,它只会响应404 - 毫不奇怪。

如果找不到缩略图来创建它,我如何修改以下Nginx-Block以向服务器发出另一个请求?

请求

http://www.proj.com/files/images/234782348234/bunny_thumb.jpg

的Nginx-块

location ~* ^/files/images/(\w+)/.+_thumb\.(jpg|png|gif)$ {
   alias /srv/proj/data/uploads/images/temp/$1_thumb.$2;
   // No image found? Request it from the server directly on "files/images/234782348234/bunny_thumb.jpg"
}

实际文件路径

/srv/proj/data/uploads/images/temp/234782348234_thumb.jpg

2 个答案:

答案 0 :(得分:2)

有时阅读nginx公司的优秀博客会有所帮助。

您搜索的内容称为带有try_files的命名位置。

https://www.nginx.com/resources/admin-guide/nginx-web-server/

https://www.nginx.com/resources/admin-guide/serving-static-content/

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

对于您的情况,我会尝试以下

location ~* ^/files/images/(\w+)/.+_thumb\.(jpg|png|gif)$ {
   try_files /srv/proj/data/uploads/images/temp/$1_thumb.$2 @callapp;
   // No image found? Request it from the server directly
   // on "files/images/234782348234/bunny_thumb.jpg"
}

location @callapp {
...
}

答案 1 :(得分:1)

所以,最后不得不再次解决它并找到了一个非常简单的解决方案。 RegexMatches仍然无法在try_files中运行。所以我只使用“alias”指向实际的文件路径,并定义了一个指向expressapp的'error_page 404':

location ~* ^/files/images/(\w+)/.+_thumb\.(jpg|png|gif)$ {
   error_page 404 @makethumb
   alias /srv/proj/data/uploads/images/temp/$1_thumb.$2;
 }

location @makethumb {
    proxy_pass http://localhost:3000$uri;
}