有几个类似的问题,但它们并不能解决我的问题。
我使用 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;
}