> Это не подзапрос баннера. Это подзапрос
> fastcgi_cache_background_update. Но в нём используются те же
> переменные, что уже перезаписаны подзапросом баннера, и в
> результате на бэкенд уходит неправильное значение переменной
> PATH_TRANSLATED. И бэкенд, в свою очередь, отвечает на него в
> соответствии с этим неправильным значением.
Вот теперь, кажется, понимаю.
Фоновый подзапрос обновления всей страницы получает переопределённые переменные окружения и вместо генерации страницы генерирует пустой баннер, который сохраняется в кэш.
> Наиболее простое решение - использовать отдельный location для
> баннеров с отдельными же переменными.
Так и сделано (https://forum.nginx.org/read.php?21,279356,279363#msg-279363):
location /banner/ {
internal;
fastcgi_cache banner;
fastcgi_cache_valid 200 24h;
fastcgi_cache_key '$uri$is_args$args';
set $handler banner.html;
set $querystring $args;
fastcgi_param REQUEST_URI $uri$is_args$args;
fastcgi_param SCRIPT_NAME $uri$is_args$args;
fastcgi_param PATH_INFO $uri$is_args$args;
include parser;
fastcgi_pass fcgiwrap;
}
> Наиболее правильное -
> переписать логику так, чтобы нужные бэкенду значения вычислялись
> не с помощью set, а с помощью map { volatile; ... }.
Ясно, значения не будут кэшироваться и можно будет получить корректные переменные окружения для каждого подзапроса.
Спасибо, попробую.