"Варьировать: если-нет-совпадают" для кэширования мобильных и настольных запросов отдельно
Примечание: пожалуйста, поправьте меня, если какое-либо из моих предположений неверно. Я не очень уверен в этом...
Я играл с HTTP-кэшированием на Heroku и пытался разобраться хороший способ различать мобильные и настольные запросы при кэшировании с помощью лака на хероку.
Моя первая идея заключалась в том, что я мог бы установить ЗаголовокVary
, чтобы кэш менялся на If-None-Match
. Поскольку Rails автоматически отправляет обратно etags, сгенерированные из хэша содержимого, etag будет отличаться между настольными и мобильными запросами (разные шаблоны), и поэтому он в конечном итоге кэширует две версии (не факт, просто мои оригинальные мысли). Я играл с этим, но я не думаю, что это работает.
Во-первых, я не могу обернуть свою голову вокруг того, когда / если что-то кэшируется, так как наверняка запросы с If-None-Match
будут условными в любом случае? Во-вторых, на практике свежие запросы (без If-None-Match) иногда поступают на мобильный сайт. Это потому, что кэш не знает, стоит ли подавайте мобильную или настольную кэшированную версию в качестве заголовка If-None-Match
, не так ли?
Как это, вероятно, звучит, я довольно смущен. Будет ли этот подход работать в любом случае, или я просто глуп? Кроме того, есть ли в любом случае для достижения отдельных кэшированных версий, если я не могу достичь конфигурации лак вообще (как я на Heroku)?
Точный код, который я использую в Rails для установки заголовков кэша:
response.headers['Cache-Control'] = 'public, max-age=86400'
response.headers['Vary'] = 'If-None-Match'
Edit: я знаю, что могу использовать Vary: User-Agent
, но пытаюсь избежать этого, если это возможно из-за он имеет высокий процент промахов (многие, многие агенты пользователей).
2 ответа:
Можно попробовать
Другим решением может быть обнаружение мобильных браузеров непосредственно в обратном прокси, установка заголовка клиента X-Is-Mobile-Browser до того, как обратный прокси попытается найти кэшированную страницу, установкаVary: User-Agent
. Однако у вас будет много кэшированных версий одной страницы (по одной для каждого агента пользователя).Vary: X-Is-Mobile-Browser
на бэкэнд-сервере (так что обратный прокси будет кэшировать только 2 версии одной и той же страницы) и замена этого заголовка наVary: User-Agent
перед отправкой клиенту.
Если вы не можете изменить конфигурацию лака, вам нужно сделать разные URL-адреса для мобильных и настольных страниц. Вы можете добавить некоторый url-параметр (
Это имеет большой смысл, потому что (я видел это много раз, как в CMSs, так и в приложениях) в какой-то момент времени вы хотите дифференцировать контент и структуру для мобильных устройств. Люди просто делают разные вещи или ищут другую информацию на мобильных устройствах...?mobile=true
), добавить фрагмент в свой путь (yourdomain.com/mobile/news
) или использовать другой хост (например,m.yourdomain.com
).