将 Varnish VCL 从 3 版本转换为 5.1.2 版本
Convert Varnish VCL from 3 to 5.1.2 version
我有这个 Varnish 默认 VCL,它在 3.x 版本中运行良好。但是,现在是升级的时候了。我们如何将 varnish vcl 以下版本升级到最新版本 5.1.2,任何人都可以提供帮助,它也可能对其他许多人有帮助。
backend default {
.host = "00.00.0.0";
.port = "8080";
}
acl purgers {
"00.00.0.1";
"00.00.0.2";
"00.00.0.3";
"00.00.0.4";
"00.00.0.5";
"192.168.0.0."/16;
"192.168.1.0."/16;
"00.00.0.0";
"127.0.0.1";
}
# Routine to identify and classify a device based on User-Agent
sub detect_device {
# Default to classification as a PC
set req.http.X-Device = "pc";
if (req.http.User-Agent ~ "iPad" ) {
# The User-Agent indicates it's a iPad - so classify as a tablet
set req.http.X-Device = "mobile-tablet";
}
elsif (req.http.User-Agent ~ "iP(hone|od)" || req.http.User-Agent ~ "Android") {
# The User-Agent indicates it's a iPhone, iPod or Android - so let's
classify as a touch/smart phone
set req.http.X-Device = "mobile-smart";
}
elsif (req.http.User-Agent ~ "SymbianOS" || req.http.User-Agent ~ "^BlackBerry" || req.http.User-Agent ~ "^SonyEricsson" || req.http.User-Agent ~ "^Nokia" || req.http.User-Agent ~ "^SAMSUNG" || req.http.User-Agent ~ "^LG") {
# The User-Agent indicates that it is some other mobile devices, so let's classify it as such.
set req.http.X-Device = "mobile-other";
}
}
sub vcl_hash {
# If the device has been classified as any sort of mobile device, include the User-Agent in the hash
# However, do not do this for any static assets as our web application returns the same ones for every device.
if (!(req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*| )$")) {
hash_data(req.http.X-Device);
}
}
sub vcl_recv {
# Everything to HTTPS
if ( req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.X-Redir-Url = "https://" + req.http.Host + req.url;
error 750 req.http.x-Redir-Url;
}
call detect_device;
set client.identity = req.http.cookie;
if (req.request == "PURGE") {
if (!client.ip ~ purgers) {
error 405 "Method not allowed";
}
return(lookup);
}
# SSL header
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
// Remove has_js and Google Analytics __* cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
// Remove a ";" prefix, if present.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.url ~ "spliting.php" || req.url ~ "featured") {
return (pass);
}
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
remove req.http.Accept-Encoding;
}
elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
else {
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "\.(ico|png|jpeg|jpg|gif|xpm|css|swf|flv|txt)$") {
remove req.http.cookie;
return (lookup);
}
return (lookup);
}
sub vcl_error {
if (obj.status == 750) {
set obj.http.Location = obj.response;
set obj.status = 301;
return (deliver);
}
if (obj.status == 204) {
unset obj.http.Server;
unset obj.http.Content-Length;
unset obj.http.Date;
unset obj.http.X-Varnish;
unset obj.http.Age;
unset obj.http.Via;
synthetic {""};
}
if (obj.status == 500 || obj.status == 502 || obj.status == 503 || obj.status == 504) {
#if (obj.status >= 500) {
unset obj.http.X-Varnish;
unset obj.http.Server;
unset obj.http.Via;
set obj.ttl = 0s;
synthetic {""};
}
return (deliver);
}
sub vcl_fetch {
if ((req.request != "POST") && (!req.url ~ "accept_cookie.php")) {
set beresp.ttl = 30m;
} else {
set beresp.ttl = 0s;
}
if ((req.url ~ "/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/Permanent/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/$") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=21600, s-maxage=21600";
remove beresp.http.Pragma;
set beresp.ttl = 30d;
return(deliver);
}
if ((req.url ~ "imagez|many") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=12966777, s-maxage=12966777";
remove beresp.http.Pragma;
set beresp.ttl = 366d;
return(deliver);
}
if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) {
#if (beresp.status >= 500) {
set beresp.ttl = 0s;
}
# Varnish determined the object was not cacheable
if (beresp.ttl <= 0s) {
set beresp.http.X-Cacheable = "NO:Not Cacheable";
# You don't wish to cache content for logged in users
} elsif (req.http.Cookie ~ "(UserID|_session)") {
set beresp.http.X-Cacheable = "NO:Got Session";
return(hit_for_pass);
# You are respecting the Cache-Control=private header from the backend
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.http.X-Cacheable = "NO:Cache-Control=private";
return(hit_for_pass);
# Varnish determined the object was cacheable
} else {
set beresp.storage = "foo";
set beresp.http.x-storage = "foo";
set beresp.http.Cache-Control = "public, max-age=14900, s-maxage=14900";
remove beresp.http.Pragma;
remove beresp.http.expires;
}
# set beresp.grace = 240m;
set beresp.grace = 30m;
return(deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 404 "Not in cache";
}
}
sub vcl_pass {
if (req.request == "PURGE") {
error 502 "PURGE on a passed object";
}
}
我真的不认为它可以使其他人受益,因为您的 VCL 不必要地复杂(我的标准建议是从空开始 default.vcl
并根据需要逐位添加,以了解其工作原理.
直接重写:
vcl 4.0;
backend default {
.host = "00.00.0.0";
.port = "8080";
}
acl purgers {
"00.00.0.1";
"00.00.0.2";
"00.00.0.3";
"00.00.0.4";
"00.00.0.5";
"192.168.0.0."/16;
"192.168.1.0."/16;
"00.00.0.0";
"127.0.0.1";
}
# Routine to identify and classify a device based on User-Agent
sub detect_device {
# Default to classification as a PC
set req.http.X-Device = "pc";
if (req.http.User-Agent ~ "iPad" ) {
# The User-Agent indicates it's a iPad - so classify as a tablet
set req.http.X-Device = "mobile-tablet";
}
elsif (req.http.User-Agent ~ "iP(hone|od)" || req.http.User-Agent ~ "Android") {
# The User-Agent indicates it's a iPhone, iPod or Android - so let's classify as a touch/smart phone
set req.http.X-Device = "mobile-smart";
}
elsif (req.http.User-Agent ~ "SymbianOS" || req.http.User-Agent ~ "^BlackBerry" || req.http.User-Agent ~ "^SonyEricsson" || req.http.User-Agent ~ "^Nokia" || req.http.User-Agent ~ "^SAMSUNG" || req.http.User-Agent ~ "^LG") {
# The User-Agent indicates that it is some other mobile devices, so let's classify it as such.
set req.http.X-Device = "mobile-other";
}
}
sub vcl_hash {
# If the device has been classified as any sort of mobile device, include the User-Agent in the hash
# However, do not do this for any static assets as our web application returns the same ones for every device.
if (!(req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*| )$")) {
hash_data(req.http.X-Device);
}
}
sub vcl_recv {
# Everything to HTTPS
if ( req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.X-Redir-Url = "https://" + req.http.Host + req.url;
return (synth(750, ""));
}
call detect_device;
set client.identity = req.http.cookie;
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return (synth(405, "Method not allowed"));
}
return(purge);
}
# SSL header
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
// Remove has_js and Google Analytics __* cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
// Remove a ";" prefix, if present.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.url ~ "spliting.php" || req.url ~ "featured") {
return (pass);
}
if (req.url ~ "\.(ico|png|jpeg|jpg|gif|xpm|css|swf|flv|txt)$") {
unset req.http.cookie;
return (hash);
}
return (hash);
}
sub vcl_synth {
if (resp.status == 750) {
set resp.http.Location = req.http.X-Redir-Url;
set resp.status = 301;
return (deliver);
}
if (resp.status == 204) {
unset resp.http.Server;
unset resp.http.Content-Length;
unset resp.http.Date;
unset resp.http.X-Varnish;
unset resp.http.Age;
unset resp.http.Via;
synthetic ({""});
return (deliver);
}
}
sub vcl_backend_response {
if ((bereq.method != "POST") && (!bereq.url ~ "accept_cookie.php")) {
set beresp.ttl = 30m;
} else {
set beresp.ttl = 0s;
}
if ((bereq.url ~ "/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/Permanent/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/$") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.http.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=21600, s-maxage=21600";
unset beresp.http.Pragma;
set beresp.ttl = 30d;
return(deliver);
}
if ((bereq.url ~ "imagez|many") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.http.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=12966777, s-maxage=12966777";
unset beresp.http.Pragma;
set beresp.ttl = 366d;
return(deliver);
}
if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) {
set beresp.ttl = 0s;
}
# Varnish determined the object was not cacheable
if (beresp.ttl <= 0s) {
set beresp.http.X-Cacheable = "NO:Not Cacheable";
# You don't wish to cache content for logged in users
} elsif (bereq.http.Cookie ~ "(UserID|_session)") {
set beresp.http.X-Cacheable = "NO:Got Session";
set beresp.uncacheable = true;
set beresp.ttl = 120s;
return (deliver);
# You are respecting the Cache-Control=private header from the backend
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.http.X-Cacheable = "NO:Cache-Control=private";
set beresp.uncacheable = true;
set beresp.ttl = 120s;
return (deliver);
# Varnish determined the object was cacheable
} else {
set beresp.http.storage = "foo";
set beresp.http.x-storage = "foo";
set beresp.http.Cache-Control = "public, max-age=14900, s-maxage=14900";
unset beresp.http.Pragma;
unset beresp.http.expires;
}
# set beresp.grace = 240m;
set beresp.grace = 30m;
return(deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
我有这个 Varnish 默认 VCL,它在 3.x 版本中运行良好。但是,现在是升级的时候了。我们如何将 varnish vcl 以下版本升级到最新版本 5.1.2,任何人都可以提供帮助,它也可能对其他许多人有帮助。
backend default {
.host = "00.00.0.0";
.port = "8080";
}
acl purgers {
"00.00.0.1";
"00.00.0.2";
"00.00.0.3";
"00.00.0.4";
"00.00.0.5";
"192.168.0.0."/16;
"192.168.1.0."/16;
"00.00.0.0";
"127.0.0.1";
}
# Routine to identify and classify a device based on User-Agent
sub detect_device {
# Default to classification as a PC
set req.http.X-Device = "pc";
if (req.http.User-Agent ~ "iPad" ) {
# The User-Agent indicates it's a iPad - so classify as a tablet
set req.http.X-Device = "mobile-tablet";
}
elsif (req.http.User-Agent ~ "iP(hone|od)" || req.http.User-Agent ~ "Android") {
# The User-Agent indicates it's a iPhone, iPod or Android - so let's
classify as a touch/smart phone
set req.http.X-Device = "mobile-smart";
}
elsif (req.http.User-Agent ~ "SymbianOS" || req.http.User-Agent ~ "^BlackBerry" || req.http.User-Agent ~ "^SonyEricsson" || req.http.User-Agent ~ "^Nokia" || req.http.User-Agent ~ "^SAMSUNG" || req.http.User-Agent ~ "^LG") {
# The User-Agent indicates that it is some other mobile devices, so let's classify it as such.
set req.http.X-Device = "mobile-other";
}
}
sub vcl_hash {
# If the device has been classified as any sort of mobile device, include the User-Agent in the hash
# However, do not do this for any static assets as our web application returns the same ones for every device.
if (!(req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*| )$")) {
hash_data(req.http.X-Device);
}
}
sub vcl_recv {
# Everything to HTTPS
if ( req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.X-Redir-Url = "https://" + req.http.Host + req.url;
error 750 req.http.x-Redir-Url;
}
call detect_device;
set client.identity = req.http.cookie;
if (req.request == "PURGE") {
if (!client.ip ~ purgers) {
error 405 "Method not allowed";
}
return(lookup);
}
# SSL header
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
// Remove has_js and Google Analytics __* cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
// Remove a ";" prefix, if present.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.url ~ "spliting.php" || req.url ~ "featured") {
return (pass);
}
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
remove req.http.Accept-Encoding;
}
elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
else {
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "\.(ico|png|jpeg|jpg|gif|xpm|css|swf|flv|txt)$") {
remove req.http.cookie;
return (lookup);
}
return (lookup);
}
sub vcl_error {
if (obj.status == 750) {
set obj.http.Location = obj.response;
set obj.status = 301;
return (deliver);
}
if (obj.status == 204) {
unset obj.http.Server;
unset obj.http.Content-Length;
unset obj.http.Date;
unset obj.http.X-Varnish;
unset obj.http.Age;
unset obj.http.Via;
synthetic {""};
}
if (obj.status == 500 || obj.status == 502 || obj.status == 503 || obj.status == 504) {
#if (obj.status >= 500) {
unset obj.http.X-Varnish;
unset obj.http.Server;
unset obj.http.Via;
set obj.ttl = 0s;
synthetic {""};
}
return (deliver);
}
sub vcl_fetch {
if ((req.request != "POST") && (!req.url ~ "accept_cookie.php")) {
set beresp.ttl = 30m;
} else {
set beresp.ttl = 0s;
}
if ((req.url ~ "/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/Permanent/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/$") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=21600, s-maxage=21600";
remove beresp.http.Pragma;
set beresp.ttl = 30d;
return(deliver);
}
if ((req.url ~ "imagez|many") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=12966777, s-maxage=12966777";
remove beresp.http.Pragma;
set beresp.ttl = 366d;
return(deliver);
}
if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) {
#if (beresp.status >= 500) {
set beresp.ttl = 0s;
}
# Varnish determined the object was not cacheable
if (beresp.ttl <= 0s) {
set beresp.http.X-Cacheable = "NO:Not Cacheable";
# You don't wish to cache content for logged in users
} elsif (req.http.Cookie ~ "(UserID|_session)") {
set beresp.http.X-Cacheable = "NO:Got Session";
return(hit_for_pass);
# You are respecting the Cache-Control=private header from the backend
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.http.X-Cacheable = "NO:Cache-Control=private";
return(hit_for_pass);
# Varnish determined the object was cacheable
} else {
set beresp.storage = "foo";
set beresp.http.x-storage = "foo";
set beresp.http.Cache-Control = "public, max-age=14900, s-maxage=14900";
remove beresp.http.Pragma;
remove beresp.http.expires;
}
# set beresp.grace = 240m;
set beresp.grace = 30m;
return(deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 404 "Not in cache";
}
}
sub vcl_pass {
if (req.request == "PURGE") {
error 502 "PURGE on a passed object";
}
}
我真的不认为它可以使其他人受益,因为您的 VCL 不必要地复杂(我的标准建议是从空开始 default.vcl
并根据需要逐位添加,以了解其工作原理.
直接重写:
vcl 4.0;
backend default {
.host = "00.00.0.0";
.port = "8080";
}
acl purgers {
"00.00.0.1";
"00.00.0.2";
"00.00.0.3";
"00.00.0.4";
"00.00.0.5";
"192.168.0.0."/16;
"192.168.1.0."/16;
"00.00.0.0";
"127.0.0.1";
}
# Routine to identify and classify a device based on User-Agent
sub detect_device {
# Default to classification as a PC
set req.http.X-Device = "pc";
if (req.http.User-Agent ~ "iPad" ) {
# The User-Agent indicates it's a iPad - so classify as a tablet
set req.http.X-Device = "mobile-tablet";
}
elsif (req.http.User-Agent ~ "iP(hone|od)" || req.http.User-Agent ~ "Android") {
# The User-Agent indicates it's a iPhone, iPod or Android - so let's classify as a touch/smart phone
set req.http.X-Device = "mobile-smart";
}
elsif (req.http.User-Agent ~ "SymbianOS" || req.http.User-Agent ~ "^BlackBerry" || req.http.User-Agent ~ "^SonyEricsson" || req.http.User-Agent ~ "^Nokia" || req.http.User-Agent ~ "^SAMSUNG" || req.http.User-Agent ~ "^LG") {
# The User-Agent indicates that it is some other mobile devices, so let's classify it as such.
set req.http.X-Device = "mobile-other";
}
}
sub vcl_hash {
# If the device has been classified as any sort of mobile device, include the User-Agent in the hash
# However, do not do this for any static assets as our web application returns the same ones for every device.
if (!(req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*| )$")) {
hash_data(req.http.X-Device);
}
}
sub vcl_recv {
# Everything to HTTPS
if ( req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.X-Redir-Url = "https://" + req.http.Host + req.url;
return (synth(750, ""));
}
call detect_device;
set client.identity = req.http.cookie;
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return (synth(405, "Method not allowed"));
}
return(purge);
}
# SSL header
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
// Remove has_js and Google Analytics __* cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
// Remove a ";" prefix, if present.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
if (req.url ~ "spliting.php" || req.url ~ "featured") {
return (pass);
}
if (req.url ~ "\.(ico|png|jpeg|jpg|gif|xpm|css|swf|flv|txt)$") {
unset req.http.cookie;
return (hash);
}
return (hash);
}
sub vcl_synth {
if (resp.status == 750) {
set resp.http.Location = req.http.X-Redir-Url;
set resp.status = 301;
return (deliver);
}
if (resp.status == 204) {
unset resp.http.Server;
unset resp.http.Content-Length;
unset resp.http.Date;
unset resp.http.X-Varnish;
unset resp.http.Age;
unset resp.http.Via;
synthetic ({""});
return (deliver);
}
}
sub vcl_backend_response {
if ((bereq.method != "POST") && (!bereq.url ~ "accept_cookie.php")) {
set beresp.ttl = 30m;
} else {
set beresp.ttl = 0s;
}
if ((bereq.url ~ "/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/Permanent/[\w\-]+/[\w\-]+/[\w\-]+/[\w\-]+/$") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.http.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=21600, s-maxage=21600";
unset beresp.http.Pragma;
set beresp.ttl = 30d;
return(deliver);
}
if ((bereq.url ~ "imagez|many") && (beresp.ttl > 0s)) {
unset beresp.http.cache-control;
unset beresp.http.expires;
unset beresp.http.cookie;
set beresp.do_gzip = true;
set beresp.http.storage = "bar";
set beresp.http.x-storage = "bar";
set beresp.http.Cache-Control = "public, max-age=12966777, s-maxage=12966777";
unset beresp.http.Pragma;
set beresp.ttl = 366d;
return(deliver);
}
if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) {
set beresp.ttl = 0s;
}
# Varnish determined the object was not cacheable
if (beresp.ttl <= 0s) {
set beresp.http.X-Cacheable = "NO:Not Cacheable";
# You don't wish to cache content for logged in users
} elsif (bereq.http.Cookie ~ "(UserID|_session)") {
set beresp.http.X-Cacheable = "NO:Got Session";
set beresp.uncacheable = true;
set beresp.ttl = 120s;
return (deliver);
# You are respecting the Cache-Control=private header from the backend
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.http.X-Cacheable = "NO:Cache-Control=private";
set beresp.uncacheable = true;
set beresp.ttl = 120s;
return (deliver);
# Varnish determined the object was cacheable
} else {
set beresp.http.storage = "foo";
set beresp.http.x-storage = "foo";
set beresp.http.Cache-Control = "public, max-age=14900, s-maxage=14900";
unset beresp.http.Pragma;
unset beresp.http.expires;
}
# set beresp.grace = 240m;
set beresp.grace = 30m;
return(deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}