Spec-Zone.ru › Varnish

VMOD cookie — Модуль куки Varnish

КРАТКОЕ ОПИСАНИЕ

import cookie [as name] [from "path"]

VOID clean()

VOID delete(STRING cookiename)

VOID filter(STRING filterstring)

VOID filter_re(REGEX expression)

VOID keep(STRING filterstring)

VOID keep_re(REGEX expression)

STRING format_date(TIME now, DURATION timedelta)

STRING get(STRING cookiename)

STRING get_re(REGEX expression)

STRING get_string()

BOOL isset(STRING cookiename)

VOID parse(STRING cookieheader)

VOID set(STRING cookiename, STRING value)

ОПИСАНИЕ

Упрощенная работа с HTTP-куки в Varnish VCL.

Разбирает заголовок куки в внутренний хранилище данных, где доступны функции получения/установки/удаления куки. Функция keep() удаляет все куки, кроме указанных в виде запятой-разделенного списка. Функция filter() удаляет куки из запятой-разделенного списка.

Регулярные выражения могут использоваться для выбора куки, удаления совпадающих куки и удаления куки с несовпадающими именами.

Включена удобная функция для форматирования даты поля Set-Cookie Expires.

Состояние, загруженное с помощью cookie.parse(), существует на протяжении текущего запроса или контекста запроса к бэкенду. Для передачи переменных в запрос к бэкенду сохраните содержимое как фейковые заголовки bereq.

Пример фильтрации:

import cookie;

sub vcl_recv {
    if (req.http.cookie) {
        cookie.parse(req.http.cookie);
        # Either delete the ones you want to get rid of:
        cookie.delete("cookie2");
        # or delete all but a few:
        cookie.keep("SESSIONID,PHPSESSID");

        # Store it back into req so it will be passed to the backend.
        set req.http.cookie = cookie.get_string();

        # If empty, unset so the builtin VCL can consider it for caching.
        if (req.http.cookie == "") {
            unset req.http.cookie;
        }
    }
}

ПУСТОЕ clean()

Очистка ранее обработанных куки. В обычной работе вызывать clean() не нужно.

Пример:

sub vcl_recv {
    cookie.clean();
}

ПУСТОЕ delete(СТРОКА cookiename)

Удаляет cookiename из внутреннего хранилища vmod, если оно существует.

Пример:

sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2");
    cookie.delete("cookie2");
    # get_string() will now yield "cookie1=value1"
}

ПУСТОЕ filter(СТРОКА filterstring)

Удаляет все куки из внутреннего хранилища vmod, имена которых присутствуют в запятой-разделенном аргументе cookienames.

Пример:

sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
    cookie.filter("cookie1,cookie2");
    # get_string() will now yield "cookie3=value3"
}

ПУСТОЕ filter_re(REGEX выражение)

Удаляет все куки из внутреннего хранилища vmod, имена которых соответствуют регулярному выражению expression.

Пример:

sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
    cookie.filter_re("^cookie[12]$");
    # get_string() will now yield "cookie3=value3"
}

ПУСТОЕ keep(СТРОКА filterstring)

Удаляет все куки из внутреннего хранилища vmod, имена которых отсутствуют в запятой-разделенном аргументе cookienames.

Пример:

sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
    cookie.keep("cookie1,cookie2");
    # get_string() will now yield "cookie1=value1; cookie2=value2"
}

ПУСТОЕ keep_re(REGEX выражение)

Удаляет все куки из внутреннего хранилища vmod, имена которых не соответствуют выражению expression.

Пример:

sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
    cookie.keep_re("^cookie[12]$");
    # get_string() will now yield "cookie1=value1; cookie2=value2"
}

СТРОКА format_date(ВРЕМЯ now, ДЛИТЕЛЬНОСТЬ timedelta)

Возвращает строку даты в формате RFC1123, подходящую для включения в заголовок ответа Set-Cookie.

Следует быть внимательным, если в ответе несколько заголовков Set-Cookie. В этом случае следует использовать заголовок vmod.

Пример:

sub vcl_deliver {
    # Set a userid cookie on the client that lives for 5 minutes.
    set resp.http.Set-Cookie = "userid=" + req.http.userid +
        "; Expires=" + cookie.format_date(now, 5m) + "; httpOnly";
}

СТРОКА get(СТРОКА cookiename)

Возвращает значение cookiename, хранящееся во внутреннем хранилище vmod.

Пример:

import std;
sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2");
    std.log("cookie1 value is: " + cookie.get("cookie1"));
}

Если cookiename не существует, возвращается строка NULL. Обратите внимание, что строка NULL преобразуется в пустую строку при присвоении заголовку. Это означает, что следующее верно:

if (req.http.Cookie) {
        cookie.parse(req.http.Cookie);
        set req.http.X-tmp = cookie.get("a_cookie");
} else {
        set req.http.X-tmp = "";
}
if (req.http.X-tmp != "") {
        // do something with the X-tmp header...
} else {
        // fallback case
}

Однако, использование cookie.isset() зачастую является лучшим способом проверки наличия определенной куки, как показано ниже:

unset req.http.X-tmp; # unnecessary if no fallback is needed
if (req.http.Cookie) {
        cookie.parse(req.http.Cookie);
        if (cookie.isset("a_cookie")) {
                set req.http.X-tmp = cookie.get("a_cookie");
                # do something with the X-tmp header...
        }
}
# if necessary, do something when a_cookie is not there
if (!req.http.X-tmp) {
        # fallback case
}

СТРОКА get_re(REGEX выражение)

Возвращает значение первой куки во внутреннем хранилище vmod, соответствующей регулярному выражению expression. Если ничего не найдено, возвращается строка NULL.

Пример:

import std;
sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2");
    std.log("cookie1 value is: " + cookie.get_re("^cookie1$"));
}

СТРОКА get_string()

Возвращает строковое значение всех куки во внутреннем хранилище vmod. Не изменяет внутреннее хранилище.

Пример:

sub vcl_recv {
    cookie.parse(req.http.cookie);
    cookie.keep("SESSIONID,PHPSESSID");
    set req.http.cookie = cookie.get_string();
}

БУЛЕВО isset(СТРОКА cookiename)

Проверяет, установлена ли cookiename во внутреннем хранилище vmod.

Пример:

import std;
sub vcl_recv {
    cookie.parse("cookie1=value1; cookie2=value2");
    if (cookie.isset("cookie2")) {
        std.log("cookie2 is set.");
    }
}

ПУСТОЕ parse(СТРОКА cookieheader)

Разбирает строку куки в cookieheader. Если состояние уже существует, clean() будет выполнено сначала.

Пример:

sub vcl_recv {
    cookie.parse(req.http.Cookie);
}

ПУСТОЕ set(СТРОКА cookiename, СТРОКА value)

Устанавливает внутреннее хранилище vmod для cookiename на value.

Пример:

sub vcl_recv {
    cookie.set("cookie1", "value1");
    std.log("cookie1 value is: " + cookie.get("cookie1"));
}

УСТАРЕВШЕЕ

ПСЕВДОНИМ format_rfc1123()

Устаревший псевдоним для format_date().

АВТОРСКИЕ ПРАВА

This document is licensed under the same conditions as Varnish itself.
See LICENSE for details.

SPDX-License-Identifier: BSD-2-Clause

Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/reference/vmod_cookie.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API