VMOD Cookie-Varnish Cookie模块¶
SYNOPSIS¶
import cookie [as name] [from "path"] 清理后的空洞() VOID DELETE(字符串cookiename) VOID过滤器(字符串过滤器字符串) VOID FILTER_RE(REGEX表达式) VOID KEEP(字符串过滤器字符串) VOID KEEP_RE(REGEX表达式) 字符串FORMAT_DATE(当前时间,持续时间增量) 字符串GET(字符串cookiename) 字符串GET_RE(REGEX表达式) 字符串get_string() Bool isset(字符串cookiename) Void parse(字符串cookieHeader) Void set(字符串cookiename,字符串值)
DESCRIPTION¶
在Varnish VCL中更轻松地处理HTTP Cookie。
将Cookie标头解析到内部数据存储中,其中可以使用每个Cookie的获取/设置/删除功能。Keep()函数删除除一组逗号分隔的Cookie之外的所有Cookie。Filter()函数删除逗号分隔的Cookie列表。
正则表达式可用于选择Cookie、删除匹配的Cookie和删除不匹配的Cookie名称。
还包括用于格式化Set-Cookie Expires Date字段的方便函数。
使用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;
}
}
}
清理后的空洞()¶
清理以前解析的Cookie。在正常操作中,不需要运行CLEAN()。
示例::
sub vcl_recv {
cookie.clean();
}
VOID DELETE(字符串cookiename)¶
删除 cookiename
来自内部vmod存储(如果存在)。
示例::
sub vcl_recv {
cookie.parse("cookie1=value1; cookie2=value2");
cookie.delete("cookie2");
# get_string() will now yield "cookie1=value1"
}
VOID过滤器(字符串过滤器字符串)¶
从内部vmod存储中删除逗号分隔的参数cookiename中的所有cookie。
示例::
sub vcl_recv {
cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
cookie.filter("cookie1,cookie2");
# get_string() will now yield "cookie3=value3"
}
VOID FILTER_RE(REGEX表达式)¶
从内部vmod存储中删除与正则表达式匹配的所有Cookie expression
。
示例::
sub vcl_recv {
cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
cookie.filter_re("^cookie[12]$");
# get_string() will now yield "cookie3=value3"
}
VOID KEEP(字符串过滤器字符串)¶
从内部vmod存储中删除不在逗号分隔的参数cookiename中的所有cookie。
示例::
sub vcl_recv {
cookie.parse("cookie1=value1; cookie2=value2; cookie3=value3");
cookie.keep("cookie1,cookie2");
# get_string() will now yield "cookie1=value1; cookie2=value2"
}
VOID KEEP_RE(REGEX表达式)¶
从内部vmod存储中删除与表达式不匹配的所有Cookie 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(当前时间,持续时间增量)¶
获取适合包含在Set-Cookie响应头中的RFC1123格式的日期字符串。
如果响应具有多个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() 通常是检查是否存在特定Cookie的更好方法,如下所示:
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存储中与正则表达式匹配的第一个Cookie的值 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存储中所有Cookie的Cookie字符串值。不修改内部存储。
示例::
sub vcl_recv {
cookie.parse(req.http.cookie);
cookie.keep("SESSIONID,PHPSESSID");
set req.http.cookie = cookie.get_string();
}
Bool isset(字符串cookiename)¶
检查是否 cookiename
设置在内部vmod存储中。
示例::
import std;
sub vcl_recv {
cookie.parse("cookie1=value1; cookie2=value2");
if (cookie.isset("cookie2")) {
std.log("cookie2 is set.");
}
}
Void parse(字符串cookieHeader)¶
解析中的Cookie字符串 cookieheader
。如果状态已经存在, clean()
将首先运行。
示例::
sub vcl_recv {
cookie.parse(req.http.Cookie);
}
Void set(字符串cookiename,字符串值)¶
将内部vmod存储设置为 cookiename
至 value
。
示例::
sub vcl_recv {
cookie.set("cookie1", "value1");
std.log("cookie1 value is: " + cookie.get("cookie1"));
}
DEPRECATED¶
别名格式_rfc1123()¶
的别名已弃用 format_date()
。
COPYRIGHT¶
This document is licensed under the same conditions as Varnish itself.
See LICENSE for details.
SPDX-License-Identifier: BSD-2-Clause