«Vary: If-None-Match» для кэширования мобильных и настольных запросов отдельно - PullRequest
5 голосов
/ 15 августа 2011

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

Я играл с HTTP-кэшированием на Heroku и пытался найти хороший способ разграничить запросы мобильных и настольных компьютеров при кэшировании с использованиемЛак на Heroku.

Моя первая идея состояла в том, чтобы я мог установить заголовок Vary, чтобы кеш варьировался на If-None-Match.Поскольку Rails автоматически отправляет обратно etags, сгенерированные из хэша контента, etag будет различаться в зависимости от запросов на настольные ПК и мобильные устройства (разные шаблоны), и поэтому в конечном итоге он будет кешировать две версии (не факт, только мои первоначальные мысли).Я играл с этим, но я не думаю, что это работает.

Во-первых, я не могу обернуться, когда / если что-то кэшируется, поскольку, конечно, запросы с If-None-Match будут в любом случае условными.?Во-вторых, на практике на мобильный сайт иногда поступают свежие запросы (без If-None-Match).Это потому, что кеш не знает, следует ли обслуживать мобильную или настольную кешированную версию, поскольку там нет заголовка If-None-Match?

Как это, возможно, звучит, я довольно запутался.Будет ли этот подход работать каким-либо образом или я глупый?Кроме того, есть ли способ получить отдельные кэшированные версии, если я вообще не могу получить доступ к конфигурации Varnish (как на Heroku)?

Точный код, который я использую в Rails для установки заголовков кэша:

response.headers['Cache-Control'] = 'public, max-age=86400'
response.headers['Vary'] = 'If-None-Match'

Редактировать: Я знаю, что могу использовать Vary: User-Agent, но стараюсь избегать его, если это возможно, из-за высокой частоты промахов (много, много пользовательских агентов).

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

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

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

1 голос
/ 16 августа 2011

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

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

...