2015-08-22 4 views
1

Существуют ли какие-либо стандарты для взаимодействия между кешем HTTP и авторизацией запроса?HTTP-кеш с авторизацией запроса

Давайте представим случай: разные URL-адреса сайта защищены системой авторизации на основе ролей. Как объединить кеширование контента с авторизацией запросов? Существует ли какой-либо подход, основанный на RFC?

  1. FoS описывает подход, когда Proxy Cache посылает запросы ГОЛОВЫ вызываемого GET URLs, чтобы проверить доступность. Похоже, что это не противоречит HTTP RFC. В RFC 7231 ГОЛОВА цели:

    Этого метод может быть использован для получения метаданных о выбранном представлении без передачи представления данных и часто используется для тестирования гипертекстовых ссылок на действий, доступность и последнюю модификацию.

    Это кажется довольно эффективным, но описание неполно. Согласно RFC-серверу should sendCache-Control: no-cache для предотвращения кэширования другими кешами из цепочки. Эта архитектура выглядит как связанная - это не-RFC-поведение, поэтому ее нужно настроить вручную.

  2. С другой стороны, похоже, проблема может быть решена с помощью Cache-Control: no-cache директивы и условных запросов RFC 7232. Этот подход не настолько эффективен, как предыдущий: предварительные условия должны быть проверены каждый раз. Главное преимущество заключается в том, что он должен работать из коробки с текущими прокси-двигателями. Я не нашел существенных противоречий с RFC, но условные запросы IMO не предназначены для авторизации запроса.

  3. Некоторые хаки могут применяться также. Определяет ли HTTP механизм для таких случаев? Или, по крайней мере, широко распространенная практика?

ответ

1

По умолчанию в лаке только кешируются только запросы GET и HEAD без «Cookie» - или «Authorization» -Header. Это выпекается в VCL по умолчанию. На Ubuntu: /etc/varnish/default.vcl:

# sub vcl_recv { 
#  ... 
#  if (req.request != "GET" && req.request != "HEAD") { 
#   /* We only deal with GET and HEAD by default */ 
#   return (pass); 
#  } 
#  if (req.http.Authorization || req.http.Cookie) { 
#   /* Not cacheable by default */ 
#   return (pass); 
#  } 
#  return (lookup); 
# }