Есть несколько похожих вопросов, но они не решают мою проблему.
Я использую 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
(по умолчанию это пустая строка) на URL-адрес, переданный на прокси-сервер s3.
Вам необходимо переписать 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;
}