Назад | Перейти на главную страницу

как проверить стоимость печенья в лаке

У меня есть файл cookie для языка. Я хочу проверить, установлен ли этот файл cookie, и проверить его значение, чтобы перенаправить пользователя на определенную страницу. имя файла cookie Lang и его ценность может быть En, Fr или Ar

if (req.http.Cookie ~ "Lang"){
//now i want to check for the cookie value
//if LANG=="Ar"
// set req.url =  req.url "CookieValue"
}

кто-нибудь знает, как проверить значение cookie в лаке ??
Спасибо

Поскольку все файлы cookie - как имя, так и значение - находятся в req.http.Cookie строка, вы должны иметь возможность проверять и имя, и значение одновременно. К сожалению, Varnish не имеет специальных методов для работы с куки-файлами - вы должны использовать регулярные выражения.

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

cookie1=abc; cookie2=def

Таким образом, мы знаем, что наш файл cookie находится либо в начале req.http.Cookie, либо ему предшествуют точка с запятой и пробел, и либо заканчивается точкой с запятой, либо находится в конце req.http.Cookie. Учитывая это, мы можем создать регулярное выражение, которое будет соответствовать нашему cookie и точке с запятой, если таковая имеется. Что-то вроде:

(^|;\s*)(Lang=En)(;|$)

Вкратце, пройдя через вышесказанное, мы имеем:

  • Первый набор скобок - совпадение начала:
    • ^ означает начало строки
    • | означает ИЛИ
    • ; берется буквально (т.е. точка с запятой)
    • \s означает пустое пространство
    • * означает одно или несколько повторений предыдущего символа
    • Резюме: либо начало строки, либо точка с запятой, за которой следует пробел
  • Второй набор скобок - соответствует файлу cookie:
    • Lang это имя файла cookie
    • En это значение cookie
  • Третий комплект скобок - совпадение конца
    • ; берется буквально (т.е. точка с запятой)
    • | означает ИЛИ
    • $ означает конец строки
    • Резюме: либо точка с запятой, либо конец строки

Используя вышеуказанное, мы можем проверить файлы cookie и выполнить с ними некоторые действия:

if (req.http.Cookie ~ "(^|;\s*)(Lang=En)(;|$)"){
    //do something with En
} elseif (req.http.Cookie ~ "(^|;\s*)(Lang=Fr)(;|$)") {
    //do something with Fr;
}

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

Возможно, вы могли бы создать регулярное выражение с группой захвата, используя regsub, и установить его как субдомен, возможно, что-то вроде:

set req.url = regsub(req.http.Cookie, "(?:^|;\s*)(?:Lang=(.*?))(?:;|$)", "\1.")+"example.com";

В случае «Lang = en» вы должны записать «en», добавить точку (.) И поставить перед «example.com» перед «en.example.com». Однако я бы посоветовал напрямую использовать cookie для установки URL-адреса - без проверки ошибок - было бы очень плохим решением. Если у вас всего 3 языка, пара операторов if и значение по умолчанию были бы намного безопаснее.

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