根据标头更改 proxy_pass 的 URL

根据标头更改 proxy_pass 的 URL

有几个类似的问题,但它们并不能解决我的问题。

我使用 nginx 作为 cdn 的代理。如果浏览器接受webp图像格式,则应提供该格式,否则提供原始格式。

假设总是存在myfilename.jpg并且myfilename.jpg.webp(如果它们不存在,我有一个后备方案来生成图像)。

我做了这样的映射:

map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

这是 nginx 配置:

server {
    listen 80;
    server_name images.cdn.de;

    error_page 403 404 = /-;

    location /- {
        proxy_pass         http://web:8808;
        proxy_redirect     off;

        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
        proxy_set_header   X-Original-URI       $original_uri;
        proxy_read_timeout 600;
        internal;
    }


    location / {

      set $original_uri $uri$is_args$args;

      proxy_http_version     1.1;
      proxy_set_header       Host 's3.eu-central-1.amazonaws.com';
      proxy_set_header       Authorization '';
      proxy_hide_header      x-amz-id-2;
      proxy_hide_header      x-amz-request-id;
      proxy_hide_header      Set-Cookie;
      proxy_ignore_headers   "Set-Cookie";
      proxy_buffering        off;
      proxy_intercept_errors on;

      expires 1y;

      proxy_pass https://s3.eu-central-1.amazonaws.com/bucket/media/public/images/;
    }
  }

这个想法是,如果图像存在,则直接从 s3 提供。如果不存在(文件名中有裁剪指令),则服务会web:8808动态生成图像并上传,以供后续调用 s3。

那项工作很好。

我想知道如何将$webp_suffix(默认为空字符串)添加到传递给 s3 代理的 url。

答案1

如果 URI 以 结尾,则需要重写它.jpg。您只需向块rewrite ... break中添加一条语句即可location /

由于您在指令中附加了 URI proxy_pass,因此rewrite ... break将导致绕过任何 URI 别名。请参阅这个文件了解详情。

一个干净的解决方案可能是始终重写 URI,而不是依赖proxy_pass别名效果:

location / {
    rewrite \.jpg$ /neuraum/media/public/images$uri$webp_suffix break;
    rewrite ^ /neuraum/media/public/images$uri break;
    ...
    proxy_pass https://s3.eu-central-1.amazonaws.com;
}

相关内容