Почему заголовок expire установлен на некоторое время в прошлом ("Солнце, 11 марта 1984 года 12:00:00 по Гринвичу") в Drupal 6/PressFlow и Drupal 7?


Я пытался понять, почему заголовок expires установлен в прошлое. Я прочитал комментарий в boostrap.inc drupal 6, но я все еще немного смущен этим и отношением между заголовками expires и vary. Я изучил это, потому что пытаюсь установить заголовок expire в надежде контролировать истечение срока действия кэша объектов, независимо от TTL. Код гласит:

  // HTTP/1.0 proxies do not support the Vary header, so prevent any caching
  // by sending an Expires date in the past. HTTP/1.1 clients ignores the
  // Expires header if a Cache-Control: max-age= directive is specified (see RFC
  // 2616, section 14.9.3).
  $default_headers['Expires'] = 'Sun, 11 Mar 1984 12:00:00 GMT';

Повлияет ли на меня, если я установлю заголовки кэширования, такие как expire? Я хочу сделать это только для анонимных пользователей.

Я опубликовал вопрос о лаке, связанный с этим здесь: https://stackoverflow.com/questions/19121220/how-to-control-how-long-varnish-expire-a-page-from-the-backend

Author: Community, 2013-10-01

1 answers

См. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3.

Если ответ содержит заголовок Expires и директиву max-age , директива max-age переопределяет заголовок Expires, даже если заголовок Expires является более ограничительным. Это правило позволяет исходному серверу чтобы обеспечить для данного ответа более длительное время истечения срока действия для Кэш HTTP/1.1 (или более поздней версии), чем в кэш HTTP/1.0.

И если вы посмотрите на следующее код, вы можете видеть, что причина, по которой они это делают, заключается в том, чтобы предотвратить кэширование и позволить вам выполнять собственное кэширование. Это отключает внутренний кэш страниц, но возвращает заголовки, позволяющие нижестоящим кэшам (таким как Squid, Varnish и другие обратные прокси-серверы) кэшировать полные страницы.

function drupal_page_cache_header_external() {
  // Get headers set in hook_boot(). Keys are lower-case.
  $hook_boot_headers = drupal_get_header();

  $max_age = variable_get('page_cache_max_age', 0);
  drupal_set_header('Cache-Control', 'public, max-age=' . $max_age);
  drupal_set_header('Last-Modified', gmdate(DATE_RFC1123, $_SERVER['REQUEST_TIME']));

  // HTTP/1.0 proxies do not support the Vary header, so prevent any caching
  // by sending an Expires date in the past. HTTP/1.1 clients ignores the
  // Expires header if a Cache-Control: max-age= directive is specified (see RFC
  // 2616, section 14.9.3).
  drupal_set_header('Expires', 'Sun, 11 Mar 1984 12:00:00 GMT');

  // Allow HTTP proxies to cache pages for anonymous users without a session
  // cookie. The Vary header is used to indicates the set of request-header
  // fields that fully determines whether a cache is permitted to use the
  // response to reply to a subsequent request for a given URL without
  // revalidation. If a Vary header has been set in hook_boot(), it is assumed
  // that the module knows how to cache the page.
  if (!isset($hook_boot_headers['vary']) && !variable_get('omit_vary_cookie', FALSE)) {
    drupal_set_header('Vary', 'Cookie');
  }
}
 4
Author: Steven, 2013-10-02 08:40:34