我有以下配置
location ~ ^\/content\/images\/(?<entity_name>\w+)\/(?<image_type>\w+\/)?(?<image_size>\w+)\/(?<add_image_id>\d+--)?([\w\-]+_)?(?<image_id>\d+)\.(?<image_extension>jpg|jpeg|png|gif) {
proxy_intercept_errors on;
error_page 404 @app-generate-image;
proxy_http_version 1.1;
proxy_set_header Authorization "";
proxy_buffering off;
proxy_cache cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 3;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
# pass request to minio
proxy_pass http://127.0.0.1:9100/project/web/content/images/$entity_name/$image_type$image_size/$add_image_id$image_id.$image_extension;
}
location @app-generate-image {
add_header "Access-Control-Allow-Origin" "";
fastcgi_intercept_errors on;
error_page 404 @storefront;
fastcgi_pass php-upstream;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root/index.php;
#fastcgi_param HTTPS $http_x_forwarded_proto;
fastcgi_param HTTPS on;
fastcgi_param HTTP_HOST $request_host;
}
location @storefront {
internal;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://storefront-upstream;
}
主要的想法是-尝试从代理服务器(minio)获取图像。如果图像在minio上不存在,则将处理传递给@app-generate-image
(该应用知道如何生成图像,如果可能的话-微缩,不同大小,等等)。
当后端应用程序无法生成图像时,将返回404。在这种情况下,应将处理发送到@storefront
以显示相应的404页面(店面已经知道如何操作)。
- 但使用此配置,我得到的是标准的nginx 404页面,而不是
@storefont
呈现的页面 *
当我从@app-generate-image
位置删除fastcgi_intercept_errors on;
时,我得到了后端应用程序呈现的错误页面,所以在我看来,error_page 404 @storefront;
似乎被忽略了。
奇怪的是,当我用try_files
指令替换代理(proxy_pass http://127.0.0.1:9100/project/web/content/images/$entity_name/$image_type$image_size/$add_image_id$image_id.$image_extension;
)时,它工作了。
有没有可能,第二个error_page
指令没有生效?我应该采取什么不同的方法来实现这一点?
我需要的是:
- 从minio获取文件,如果存在
- 如果文件是不存在的在minio上,让后端应用程序生成它
- 如果后端应用不能生成图像,则显示店面404页面(后端和店面是不同应用)
谢谢!
1条答案
按热度按时间ar7v8xwq1#
最后我还是用了
X-Accel-Redirect
。我更改了我的应用程序,因此当应用程序无法生成图像时,返回404响应,并带有标头
X-Accel-Redirect: @storefront
.Nginx,然后使用@storefront
位置呈现404页面。