como verificar o valor de um cookie no verniz

3

Eu tenho um cookie para o idioma. Quero verificar se esse cookie está definido e verificar seu valor para redirecionar o usuário para uma página específica. o nome do cookie é Lang e seu valor pode ser En, Fr ou Ar

if (req.http.Cookie ~ "Lang"){
//now i want to check for the cookie value
//if LANG=="Ar"
// set req.url =  req.url "CookieValue"
}

alguém sabe como verificar o valor do cookie no verniz?
Obrigado

    
por Alaa Alomari 11.01.2012 / 13:27

1 resposta

6

Como todos os cookies - nome e valor - estão na string req.http.Cookie , você deve verificar o nome e o valor ao mesmo tempo. Infelizmente, o Varnish não possui nenhum método especializado para lidar com cookies - você deve usar expressões regulares.

É importante notar que os cookies são delimitados por um ponto-e-vírgula e espaço em branco, por exemplo:

cookie1=abc; cookie2=def

Sabemos, portanto, que nosso cookie está no início de req.http.Cookie, ou é precedido por um ponto-e-vírgula e espaço em branco, e termina com um ponto-e-vírgula ou está no final de req.http.Cookie . Sendo assim, podemos construir um regex que corresponda ao nosso cookie e ao ponto e vírgula, se houver. Algo como:

(^|;\s*)(Lang=En)(;|$)

Resumidamente, passando pelo acima, temos:

  • Primeiro conjunto de colchetes - corresponde ao início:
    • ^ significa início da cadeia
    • | significa OR
    • ; é considerado literalmente (ou seja, ponto e vírgula)
    • \s significa espaço em branco
    • * significa uma ou mais repetições do caractere anterior
    • Resumo: o início da sequência ou um ponto e vírgula seguido por espaço em branco
  • Segundo conjunto de colchetes - corresponde ao cookie:
    • Lang é o nome do cookie
    • En é o valor do cookie
  • Terceiro conjunto de colchetes - corresponde ao final
    • ; é considerado literalmente (ou seja, ponto e vírgula)
    • | significa OR
    • $ significa fim da string
    • Resumo: , um ponto e vírgula ou o fim da string

Usando o acima, podemos verificar os cookies e executar alguma ação neles:

if (req.http.Cookie ~ "(^|;\s*)(Lang=En)(;|$)"){
    //do something with En
} elseif (req.http.Cookie ~ "(^|;\s*)(Lang=Fr)(;|$)") {
    //do something with Fr;
}

Pode haver maneiras melhores, ou regexes mais eficientes (infelizmente, o verniz não tem variáveis definidas pelo usuário - o que significa que você não pode usar grupos de captura de regex) - mas esperamos que isso faça o trabalho.

Provavelmente, você poderia construir um regex com um grupo de captura usando regsub e definir isso como um subdomínio, talvez algo como:

set req.url = regsub(req.http.Cookie, "(?:^|;\s*)(?:Lang=(.*?))(?:;|$)", ".")+"example.com";

No caso de 'Lang = en', você pode capturar o 'en' adicionar um ponto (.) e prefixar 'example.com', fornecendo en.example.com. Eu sugiro que, embora usando diretamente um cookie para definir o URL - sem muita verificação de erros - seria uma solução muito ruim. Se você tiver apenas 3 idiomas, algumas declarações if e um padrão seriam muito mais seguros.

Nota: o acima não foi testado, e os regexes não são o meu strong - espere alguns erros - mas esperamos que a premissa funcione.

    
por 12.01.2012 / 00:33