Служите содержанию на основе языка с Лаком

Мой веб-сайт имеет несколько языков. Английский язык является языком по умолчанию с URL:

http://domain.com/ (http://domain.com/en).

Когда пользователи захотят использовать другой язык, они нажмут на кнопку языка. Например, Они хотят переключиться на японский язык:

http://domain.com/ja

В то время у них будут cookie с именем 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);
}

Когда пользователь посещает домашнюю страницу, их предпочтительный язык был изменен на английский язык. Таким образом, что-то неправильно с cookie в лаке.

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

Спасибо

1
задан 3 June 2015 в 01:45
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, которая очистит мои куки.

1
ответ дан 4 December 2019 в 00:06

Теги

Похожие вопросы