Как разрешить вызов в лаке, если cookie «lang» не задан?

Как разрешить вызов в лаке, если cookie "lang" не установлен? Я хочу разрешить вызову и не возвращать кеш, когда cookie "lang" установлен, и отправить запрос в apache, как мне это сделать?

0
задан 10 June 2021 в 18:45
1 ответ

Обход кеша, когда файл cookie lang не был установлен

В своей основной форме это код VCL, необходимый для передачи запросов в серверную часть, которые не содержат cookie lang :

sub vcl_recv {
    if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)") {
        return(pass);
    }
}

Однако вам, вероятно, потребуется определить некоторую логику в случае, если был установлен файл cookie lang .

Использование значения файла 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*($|(;[^;]*)+)

Просто настройте это регулярное выражение в соответствии со своими потребностями и языками, которые поддерживает ваша веб-платформа.

1
ответ дан 28 July 2021 в 14:06

Теги

Похожие вопросы