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.