Подавать содержимое на основе языка с лаком
Мой сайт имеет несколько языков. Английский является языком по умолчанию с URL:
http://domain.com/ ( http://domain.com/en).
Когда пользователи хотят использовать другой язык, они нажимают на кнопку языка. Например, они хотят перейти на японский:
В это время у них будут куки с именем SiteLang=ja.
Моя конфигурация лака:
backend default {
.first_byte_timeout = 15s;
.connect_timeout = 1s;
.max_connections = 200;
.between_bytes_timeout = 10s;
.port = "8080";
.host = "127.0.0.1";
}
sub vcl_recv {
if (req.http.Cookie ~ "SiteLang=") {
#unset all the cookie from request except language
set req.http.Language = regsub(req.http.Cookie, "(?:^|;\s*)(?:SiteLang=(.*?))(?:;|$)", "\1.");
} elseif (!req.http.Cookie) {
set req.http.Language = "fr";
}
# Forward client's IP to backend
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;
# Set the URI of your system directory
if (req.url ~ "^/system/" ||
req.url ~ "ACT=" ||
req.request == "POST" ||
(req.url ~ "member_box" && req.http.Cookie ~ "exp_sessionid"))
{
return (pass);
}
unset req.http.Cookie;
set req.grace = 1h;
return(lookup);
}
sub vcl_fetch {
#if (!beresp.http.set-Cookie ~ "SiteLang="){
# unset beresp.http.set-cookie;
#}
# Enable ESI includes
set beresp.do_esi = true;
# Our cache TTL
set beresp.ttl = 1m;
set beresp.grace = 1h;
return(deliver);
}
sub vcl_deliver {
if (req.http.X-Varnish-Accept-Language) {
set resp.http.Set-Cookie = req.http.Language;
}
}
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
if (req.http.Language) {
#add cookie in hash
hash_data(req.http.Language);
}
return(hash);
}
Когда пользователь посещает домашнюю страницу, его предпочтительный язык был изменен на английский. Так что что-то не так с печеньем на лаке.
Все, что я хочу, это когда пользователи выбирают свой язык, они могут перейти на домашнюю страницу, не меняя языки, и лак обслуживает кеш должным образом.
Спасибо
1 ответ
Решение
Я наконец заставил это работать.
backend default {
.first_byte_timeout = 15s;
.connect_timeout = 1s;
.max_connections = 200;
.between_bytes_timeout = 10s;
.port = "8080";
.host = "127.0.0.1";
}
sub vcl_recv {
if (req.http.Cookie ~ "SiteLang=") {
#unset all the cookie from request except language
set req.http.Language = regsub(req.http.Cookie, "(?:^|;\s*)(?:SiteLang=(.*?))(?:;|$)", "\1.");
} elseif (!req.http.Cookie) {
set req.http.Language = "fr";
}
# Forward client's IP to backend
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;
# Set the URI of your system directory
if (req.url ~ "^/system/" ||
req.url ~ "ACT=" ||
req.request == "POST" ||
(req.url ~ "member_box" && req.http.Cookie ~ "exp_sessionid"))
{
return (pass);
}
#unset req.http.Cookie;
set req.grace = 1h;
return(lookup);
}
sub vcl_fetch {
#if (!beresp.http.set-Cookie ~ "SiteLang="){
# unset beresp.http.set-cookie;
#}
# Enable ESI includes
set beresp.do_esi = true;
# Our cache TTL
set beresp.ttl = 1m;
set beresp.grace = 1h;
return(deliver);
}
sub vcl_deliver {
if (req.http.X-Varnish-Accept-Language) {
set resp.http.Set-Cookie = req.http.Language;
}
}
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
if (req.http.Language) {
#add cookie in hash
hash_data(req.http.Language);
}
return(hash);
}
Моя ошибка:
#unset req.http.Cookie;
в саб vcl_recv, который очистит мои куки.