有一些类似的问题,但他们不能解决我的问题。
我使用nginx作为cdn的代理。 如果浏览器正在接受webp作为图像格式,则应该提供服务,否则为原始。
假设总是有myfilename.jpg和myfilename.jpg.webp (如果不存在的话,我有一个后备可以生成图片)。
我做这个映射:
map $http_accept $webp_suffix { default ""; "~*webp" ".webp"; }
这是nginxconfiguration:
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 (默认为一个空string)添加到传递给s3代理的URL。
如果以.jpg结尾,则需要重写URI。 你可以添加一个rewrite ... break语句到location /块。
由于您有一个URI附加到proxy_pass指令, rewrite ... break将导致绕过任何URI别名。 详情请参阅此文件 。
干净的解决scheme可能是总是重写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; }