Обход кеша, когда не был установлен lang cookie
В самой простой форме это код VCL, который вам нужно проходят запросы к серверной части, которые не содержат язык куки:
суб vcl_recv {
if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+ )) {
вернуться (пройти);
}
}
Однако вам, вероятно, потребуется определить некоторую логику на случай, если язык куки был установлен.
Использование значения файла cookie lang
Следующий фрагмент кода VCL извлекает язык, установленный язык cookie и сохраняет его в req.http.lang.
Это значение используется для создания варианта кеша для каждого языка:
суб vcl_recv {
if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+ )) {
вернуться (пройти);
}
установить req.http.lang = regsub(req.http.Cookie,"(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[ ^;]*)+)","\3");
//Некоторая другая логика
возврат (хеш);
}
суб vcl_hash {
если (треб.http.язык) {
hash_data(req.http.lang);
}
}
Фрагмент выше также явно вызывает возврат (хэш). В какой-то момент вам нужно будет принудительно кэшировать Varnish, когда язык cookie установлен, потому что стандартное поведение Varnish кэширует что-либо при наличии файлов cookie.
я добавил //Некоторая другая логика комментарий, потому что я предполагаю, что будет больше логики для обхода кеша. Например, когда запрашиваются методы, отличные от ПОЛУЧАТЬ и ГЛАВНЫЙ используются или для пользовательских шаблонов URL-адресов, которые необходимо обходить кеш.
Избегайте слишком большого количества вариаций кеша
hash_data(req.http.lang) Оператор гарантирует, что вариант кэша будет создан для каждого значения, которое язык cookie может иметь.
Опасность в том, что пользователи с плохими намерениями начинают добавлять случайные значения в язык cookie для заполнения кеша.
Помня об этом риске, имеет смысл явно указать поддерживаемые языки в вашем регулярном выражении.
Вот исходное регулярное выражение:
(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)
Вот пример с жестко запрограммированными поддерживаемыми языками:
(^|([^;]*;)+)\s*lang=(en|es|de|it|es|fr|nl)\s*($|(;[^;]*)+)
Просто адаптируйте это регулярное выражение к своим потребностям и языкам, которые поддерживает ваша веб-платформа.