"proxy_pass" cannot have URI part in location given by regular expression
Возник вопрос с настройкой nginx. У меня есть такой конфиг nginx.conf, который работал исправно. отдавал все картинки и документы на сайте.
server {
listen 443 ssl
...
servername my-site.ru
location / {
proxy_pass https://storage.yandexcloud.net;
}
location ~ ^(.+)\.(png|jpe?g|JPE?G|PNG)${
if ($http_accept ~* "webp") {
add_header Content-Type image/webp;
add header Timing-Allow-Origin *;
rewrite (.*) $1.webp break;
}
proxy_pass https://storage.yandexcloud.net;
proxy hide header Content-Type;
}
теперь возникла необходимость изменить proxy_pass и теперь мой конфиг выглядит так:
server {
listen 443 ssl
...
servername my-site.ru
location / {
proxy_pass https://storage.yandexcloud.net/<my-bucket>;
}
location ~ ^(.+)\.(png|jpe?g|JPE?G|PNG)${
if ($http_accept ~* "webp") {
add_header Content-Type image/webp;
add header Timing-Allow-Origin *;
rewrite (.*) $1.webp break;
}
proxy_pass https://storage.yandexcloud.net/<my-bucket>;
proxy hide header Content-Type;
}
...
}
И вот если первый "location /" отрабатывает без проблем (все документы и файлы отображаются по запросу), то второй в котором идёт обработка WEBP, выдаёт ошибку: 1#1: "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, ar inzide "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/nginx.conf
что говорит о том, что нельзя использовать URI в именном location, но я никак не могу обойти эту проблему. Прошу, подскажите, как отдавать WEBP, если такая картинка есть в бакете и JPG или PNG - если нет, но при этом, чтобы proxy_pass был URI(https://storage.yandexcloud.net/my-bucket/), а не URL(https://storage.yandexcloud.net)
Ответы (1 шт):
Это требование легко обходится rewrite
-ом.
location ~ \.(png|jpe?g|JPE?G|PNG)$ {
if ($http_accept ~* "webp") {
add_header Content-Type image/webp;
add_header Timing-Allow-Origin *;
rewrite (.+) $1.webp;
}
rewrite (.+) /<my-bucket>$1 break;
proxy_pass https://storage.yandexcloud.net;
proxy_hide_header Content-Type;
}