Срок годности лака истекает

Пожалуйста, помогите мне в добавлении истекает заголовок в конфигурации лака. max_age уже определен в vcl_fetch и должен добавить заголовок expires в соответствии с max_age.

2 ответа

Обычно вам не нужно устанавливать Expires заголовок в дополнение к Cache-Control, Expires заголовок указывает кешу (будь то прокси-сервер или кеш браузера) кэшировать файл до Expires время достигнуто. Если оба Cache-Control а также Expires определены, Cache-Control имеет приоритет.

Рассмотрим следующий заголовок ответа:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Date: Fri, 14 Mar 2014 08:34:00 GMT
Expires: Fri, 14 Mar 2014 08:35:00 GMT
Cache-Control: public, max-age=600

В соответствии с Expires В заголовке содержимое должно обновляться через одну минуту, но, поскольку максимальный возраст установлен на 600 секунд, изображение остается в кэше до 08:44:00 по Гринвичу.

Если вы хотите, чтобы срок действия контента истек в определенное время, вам следует Cache-Control заголовок и использовать только Expires,

Марк Ноттингем написал очень хороший урок по кешированию. Это определенно стоит прочитать при рассмотрении вашей стратегии кэширования.

Если вы хотите установить Expires заголовок на основе Cache-Control: max-age, вам нужно использовать inline-C в вашем VCL. Следующее скопировано с https://www.varnish-cache.org/trac/wiki/VCLExampleSetExpires на случай, если страница будет удалена в будущем.

Добавьте следующие прототипы:

C{
        #include <string.h>
        #include <stdlib.h>

        void TIM_format(double t, char *p);
        double TIM_real(void);
}C

И следующий фрагмент inline-C для функции vcl_deliver:

C{
        char *cache = VRT_GetHdr(sp, HDR_RESP, "\016cache-control:");
        char date[40];
        int max_age = -1;
        int want_equals = 0;
        if(cache) {
                while(*cache != '\0') {
                        if (want_equals && *cache == '=') {
                                cache++;
                                max_age = strtoul(cache, 0, 0);
                                break;
                        }

                        if (*cache == 'm' && !memcmp(cache, "max-age", 7)) {
                                cache += 7;
                                want_equals = 1;
                                continue;
                        }
                        cache++;
                }
                if (max_age != -1) {
                        TIM_format(TIM_real() + max_age, date);
                        VRT_SetHdr(sp, HDR_RESP, "\010Expires:", date, vrt_magic_string_end);
                }
        }
}C

Если предположить, max-age уже установлен (т.е. вашим веб-сервером), вы можете установить Expires заголовок с этой конфигурацией в вашем vcl:

# Add required lib to use durations
import std;

sub vcl_backend_response {

    # If max-age is setted, add a custom header to delegate calculation to vcl_deliver
    if (beresp.ttl > 0s) {
        set beresp.http.x-obj-ttl = beresp.ttl + "s";
    }

}

sub vcl_deliver {

    # Calculate duration and set Expires header
    if (resp.http.x-obj-ttl) {
        set resp.http.Expires = "" + (now + std.duration(resp.http.x-obj-ttl, 3600s));
        unset resp.http.x-obj-ttl;
    }
}

Источник: https://www.g-loaded.eu/2016/11/25/how-to-set-the-expires-header-correctly-in-varnish/

Дополнительная информация: вы можете установить max-age на вашем сервере Apache с этим примером:

<LocationMatch "/(path1|path2)/">
    ExpiresActive On
    ExpiresDefault "access plus 1 week"
</LocationMatch>
Другие вопросы по тегам