"Варьировать: если-нет-совпадают" для кэширования мобильных и настольных запросов отдельно


Примечание: пожалуйста, поправьте меня, если какое-либо из моих предположений неверно. Я не очень уверен в этом...

Я играл с 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 5

2 ответа:

Можно попробовать Vary: User-Agent. Однако у вас будет много кэшированных версий одной страницы (по одной для каждого агента пользователя).

Другим решением может быть обнаружение мобильных браузеров непосредственно в обратном прокси, установка заголовка клиента X-Is-Mobile-Browser до того, как обратный прокси попытается найти кэшированную страницу, установка Vary: X-Is-Mobile-Browser на бэкэнд-сервере (так что обратный прокси будет кэшировать только 2 версии одной и той же страницы) и замена этого заголовка на Vary: User-Agent перед отправкой клиенту.

Если вы не можете изменить конфигурацию лака, вам нужно сделать разные URL-адреса для мобильных и настольных страниц. Вы можете добавить некоторый url-параметр (?mobile=true), добавить фрагмент в свой путь (yourdomain.com/mobile/news) или использовать другой хост (например, m.yourdomain.com).

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