Назад | Перейти на главную страницу

Запретить лак на странице кеширования, когда бэкэнд явно устанавливает Cache-Control: no-cache?

Бывают случаи, когда определенные страницы необходимо избегать кэширования, и все они имеют следующий заголовок ответа, установленный серверной частью:

Cache-Control: no-cache, no-store, must-revalidate, max-age=0

Тем не менее Varnish успешно кэширует эти страницы. Могу ли я что-то добавить в конфигурацию, чтобы предотвратить это? Я полагаю, это то, что нужно vcl_deliver или vcl_fetch подпрограммы, но документация не очень полезна (по крайней мере, мне).

В основном ищу что-то как это но наоборот - следует проверять заголовки в ответе.

Varnish - это версия 3.0 (нет, сейчас нельзя обновить)


Соответствующий конфиг:

sub vcl_fetch {
    if (req.http.X-Varnish-Use-Cache && beresp.status != 500) {
        set beresp.ttl = 24h;
        set beresp.do_esi = true;
        unset beresp.http.Set-Cookie;
    }

    return (deliver);
}

sub vcl_deliver {
    if(!resp.http.X-Cache) {
        if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT";
        } else {
            set resp.http.X-Cache = "MISS";
        }
    } else {
        if (obj.hits > 0) {
            set resp.http.X-Cache = resp.http.X-Cache + ", HIT";
        } else {
            set resp.http.X-Cache = resp.http.X-Cache + ", MISS";
        }
    }
    set resp.http.X-Flavour = req.http.X-Flavour;
    return (deliver);
}

Лак должен соответствовать Cache-Control заголовок.

Наиболее вероятная причина - return (deliver) в твоем vcl_fetch который будет обходить обработку по умолчанию, которую имеет Varnish, что обычно применяет Cache-Control настройки и пометить контент как не кэшируемый.

Поэтому я бы порекомендовал вам удалить это снизу vcl_fetch.