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

Обновить Cache-Control max-age, когда srcache возвращает ответ из кеша

Я настроил Nginx на использование srcache (вместе с модулями redis и redis2). Кеширование на стороне сервера отлично работает. Мое приложение отвечает соответствующим Expires и Cache-Control заголовки, а srcache будет сохранять и извлекать из кеша Redis соответственно.

Я хочу, чтобы мой ответ кэшировался браузерами и прокси вне моих серверов. В Expires и Cache-Control заголовки отправлены. Однако Cache-Control max-age не обновляется автоматически. Я предполагаю, что это потому, что этот заголовок фактически хранится в кеше. Обратите внимание на даты в этих ответах, и что max-age в Cache-Control заголовок все еще на 2592000... его начальное значение.

HTTP/1.1 200 OK
Server: nginx/1.2.9
Date: Tue, 01 Jul 2014 15:18:19 GMT
Content-Type: application/javascript
Content-Length: 2710
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 31 Jul 2014 15:13:00 GMT
Cache-Control: public, max-age=2592000, must-revalidate, proxy-revalidate
X-SRCache-Key: fde32bfe93fcf90c398e9ed585991146
X-SRCache-Fetch-Status: HIT
X-SRCache-Store-Status: BYPASS


HTTP/1.1 200 OK
Server: nginx/1.2.9
Date: Tue, 01 Jul 2014 15:22:13 GMT
Content-Type: application/javascript
Content-Length: 2710
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 31 Jul 2014 15:13:00 GMT
Cache-Control: public, max-age=2592000, must-revalidate, proxy-revalidate
X-SRCache-Key: fde32bfe93fcf90c398e9ed585991146
X-SRCache-Fetch-Status: HIT
X-SRCache-Store-Status: BYPASS

Есть ли способ исправить эту проблему? Вот соответствующий раздел моей конфигурации Nginx:

location / {
    # Caching keys
    set_md5 $srcache_key $request_uri; 

    srcache_ignore_content_encoding on;
    srcache_methods GET;
    srcache_fetch GET /redisFetch $srcache_key;
    srcache_store PUT /redisStore key=$srcache_key&exptime=$srcache_expire;

    add_header X-SRCache-Key $srcache_key;
    add_header X-SRCache-Fetch-Status $srcache_fetch_status;
    add_header X-SRCache-Store-Status $srcache_store_status;
    add_header X-SRCache-Expire $srcache_expire;

    include /apps/*/nginx/api.conf;
}

location = /redisFetch {
    internal;

    set $redis_key $args;
    redis_pass redis_cache;
}

location = /redisStore {
    internal;

    redis2_query set $arg_key $echo_request_body;
    redis2_query expire $arg_key $arg_exptime;
    redis2_pass redis_cache;
}

Значение max-age указывает количество секунд, в течение которых объект должен считаться свежим. Т.е. он будет кэшироваться, в том числе браузерами, в течение этого количества секунд, поэтому вам может не потребоваться что-либо делать с Cache-Control: max-age, если вашей целью является включение этого кеширования. Больше беспокойства вызывает ваш заголовок Pragma: no-cache. Также в заголовке Cache-Control вы указываете must-revalidate. Это означает, что клиентам, как правило, все равно нужно будет сделать запрос, но запрос будет включать заголовок If-Modified-Since, и тогда сервер может просто отправить ответ 304 и не должен повторно отправлять контент. Вы должны подумать, действительно ли вам нужно такое поведение.

Вот хорошее объяснение различных заголовков кеширования [http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/], или вы можете найти авторитетное слово в RFC, говоря более формальным языком [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html]

Обычно нет необходимости «обновлять» значение максимального возраста, если вы не знаете заранее, когда следующая версия контента будет сгенерирована на стороне сервера, а использование фиксированного значения для CC: max-age намного менее интенсивно для генерировать заголовок, чем каждый раз производить расчет даты.

Заголовок Cache-Control имеет приоритет над заголовком Expires для клиентов, которые понимают Cache-Control (а это большинство из них, даже те, которые утверждают, что это HTTP / 1.0).

Если ваш заголовок Expires генерируется правильно, а значение max-age не то, что вы хотите, то самым простым решением может быть подавление CC: max age вместо того, чтобы исправлять это. (http://wiki.nginx.org/HttpHeadersMoreModule)