nginx 不为代理请求呈现错误页

cdmah0mi  于 2022-12-17  发布在  Nginx
关注(0)|答案(1)|浏览(100)

我有以下配置

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页面(后端和店面是不同应用)

谢谢!

ar7v8xwq

ar7v8xwq1#

最后我还是用了X-Accel-Redirect
我更改了我的应用程序,因此当应用程序无法生成图像时,返回404响应,并带有标头X-Accel-Redirect: @storefront.Nginx,然后使用@storefront位置呈现404页面。

相关问题