В своей основной форме это код VCL, необходимый для передачи запросов в серверную часть, которые не содержат cookie lang
:
sub vcl_recv {
if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)") {
return(pass);
}
}
Однако вам, вероятно, потребуется определить некоторую логику в случае, если был установлен файл cookie lang
.
Следующий фрагмент кода VCL извлекает язык, заданный файлом cookie lang
, и сохраняет его в req.http.lang
.
Это значение используется для создания варианта кэша для каждого языка:
sub vcl_recv {
if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)") {
return(pass);
}
set req.http.lang = regsub(req.http.Cookie,"(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)","\3");
//Some other logic
return(hash);
}
sub vcl_hash {
if(req.http.lang) {
hash_data(req.http.lang);
}
}
В приведенном выше фрагменте также явно вызывается return (hash)
. В какой-то момент вам нужно будет принудительно кэшировать Varnish, когда установлен файл cookie lang
, потому что стандартное поведение Varnish кэширует все, что угодно, когда присутствуют файлы cookie.
Я добавил комментарий // Другая логика
, потому что предполагаю, что будет больше логики для обхода кеша.Например, когда используются методы запроса, отличные от GET
и HEAD
, или для пользовательских шаблонов URL-адресов, которым необходимо обходить кеш.
Оператор hash_data (req.http.lang)
гарантирует, что изменение кеша будет создано для каждого значения, которое может иметь файл cookie lang
.
Опасность заключается в том, что пользователи с плохими намерениями начинают добавлять случайные значения в файл cookie lang
для заполнения кеша.
Помня об этом риске, имеет смысл явно указать поддерживаемые языки в вашем регулярном выражении.
Вот начальное регулярное выражение:
(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)
Вот пример с жестко запрограммированными поддерживаемыми языками:
(^|([^;]*;)+)\s*lang=(en|es|de|it|es|fr|nl)\s*($|(;[^;]*)+)
Просто настройте это регулярное выражение в соответствии со своими потребностями и языками, которые поддерживает ваша веб-платформа.