Лак настраиваемый HTML на основе агента пользователя - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу отображать различные стили html для пользователей на основе $_SERVER['HTTP_USER_AGENT']. Как я могу добиться этого с помощью настроек лака, чтобы у него был определенный кэш для определенного пользовательского агента.

Я знаю, что могу добиться чего-то похожего с JS, но это не для меня, я хочу сделать это на стороне сервера.

PHP, который я буду использовать в своем html для определения пользовательских агентов, будет выглядеть так:

<?php if($_SERVER['HTTP_USER_AGENT'] == $target):?>
    <style>
      //CSS
    </style>    
    <?php endif;?>

Как мне настроить Лак , чтобы он работал аккуратно с этим?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Varnish поддерживает это по умолчанию. Вам не нужно менять конфигурацию Varnish. Вам нужно только отправить заголовок Vary :

Заголовок Vary HTTP-ответа определяет, как сопоставить будущие заголовки запроса, чтобы решить, можно ли использовать кэшированный ответ, а не запрашивать новый с исходного сервера.

В вашем конкретном случае, когда вы хотите, чтобы он варьировался в зависимости от User-Agent, Varnish поймет, что ему нужно создавать разные версии одного и того же объекта в кеше для каждого отдельного User-Agent.

Помните, что использование изменяющегося кэша может значительно снизить частоту обращений из-за количества изменений, которые имеет заголовок User-Agent. Чтобы этого не произошло, требуется нормализация. Вы можете прочитать больше о нормализации заголовков User-Agent в документации Varnish

0 голосов
/ 05 сентября 2018

Все, что вам нужно сделать, это изменить метод vcl_hash, чтобы добавить дополнительную информацию в ключ кэша.

https://varnish -cache.org / Docs / багажник / пользователей-гид / VCL-hashing.html

sub vcl_hash {
    hash_data(req.http.User-Agent);
}

Имейте в виду, что для строк User Agent не соблюдаются реальные стандарты, поэтому различия огромны даже для идентичных браузеров. Я ожидаю, что эта техника будет отсутствовать в 99% случаев, если вы сами не будете управлять агентами пользователя (внутренняя система и т. Д.)

Если вам нужен другой кеш для мобильных устройств, следующее может быть более успешным, поскольку он пытается обнаружить мобильный браузер, а затем использует нормализованное значение ключа кеша для повышения частоты обращений:

sub vcl_hash {
  if (req.http.User-Agent ~ "mobile") {
    // hash_data
    hash_data("mobile");
  }
}
...