Varnish 重定向基于浏览器语言设置
Varnish redirect based on browser language settings
我在apache 前使用varnish 4。我需要使用首选语言 es 或 ca(除非它也有 de 或 en)从 headers 向 deutsh.de 发出的请求被重定向到 spanish.es。
有人可以为我提供适当的语法吗?
谢谢
所以我设法在用于启动清漆的文件中整理了一些东西:
sub vcl_recv {
if((req.http.Accept-Language !~ "de" || req.http.Accept-Language !~ "en") && (req.http.Accept-Language ~ "es" || req.http.Accept-Language ~ "ca" || req.http.Accept-Language ~ "eu"))
{
return(synth(301,"Moved Permanently"));
}
}
sub vcl_synth {
if(req.http.Accept-Language ~ "es" || req.http.Accept-Language ~ "ca" || req.http.Accept-Language ~ "eu")
{
set resp.http.Location = "http://spanish.es";
return (deliver);
}
}
...这似乎有效
我用一些正则表达式稍微扩展了建议的解决方案,保证我们没有德语或英语作为 accept-language header.
中配置的优先级更高的语言
为了解释正则表达式,我认为最好记住这样的 Accept-Language
header 可能看起来像:Accept-Language: de-DE,en-US,es
考虑到用户的偏好,使用正则表达式搜索提供的语言,但同时确保之前找到 none 的其他提供的语言。
后者是通过否定前瞻表达式 "(^(?!de|en).)*"
以某种神秘的方式实现的,以确保 de 和 en 都不会出现在 "es|ca|eu" 项。
^ # line beginning
.* # any character repeated any number of times, including 0
?! # negative look-ahead assertion
此外,我还添加了一项检查,检查是否已使用 SSL 来实现一次重定向中的语言和 SSL 切换。
使用 return(synth(850, "Moved permanently"));
,您可以在 vcl_synth 中保存一个 if 子句,这将大大减少您的配置,尤其是当您必须执行许多基于语言的重定向时。
sub vcl_recv {
if (req.http.X-Forwarded-Proto !~ "(?i)https" && req.http.Accept-Language ~ "^((?!de|en).)*(es|ca|eu)" {
set req.http.x-redir = "https://spanish.es/" + req.url;
return(synth(850, "Moved permanently"));
}
}
sub vcl_synth {
if (resp.status == 850) {
set resp.http.Location = req.http.x-redir;
set resp.status = 301;
return (deliver);
}
}
我在apache 前使用varnish 4。我需要使用首选语言 es 或 ca(除非它也有 de 或 en)从 headers 向 deutsh.de 发出的请求被重定向到 spanish.es。 有人可以为我提供适当的语法吗? 谢谢
所以我设法在用于启动清漆的文件中整理了一些东西:
sub vcl_recv {
if((req.http.Accept-Language !~ "de" || req.http.Accept-Language !~ "en") && (req.http.Accept-Language ~ "es" || req.http.Accept-Language ~ "ca" || req.http.Accept-Language ~ "eu"))
{
return(synth(301,"Moved Permanently"));
}
}
sub vcl_synth {
if(req.http.Accept-Language ~ "es" || req.http.Accept-Language ~ "ca" || req.http.Accept-Language ~ "eu")
{
set resp.http.Location = "http://spanish.es";
return (deliver);
}
}
...这似乎有效
我用一些正则表达式稍微扩展了建议的解决方案,保证我们没有德语或英语作为 accept-language header.
中配置的优先级更高的语言
为了解释正则表达式,我认为最好记住这样的 Accept-Language
header 可能看起来像:Accept-Language: de-DE,en-US,es
考虑到用户的偏好,使用正则表达式搜索提供的语言,但同时确保之前找到 none 的其他提供的语言。
后者是通过否定前瞻表达式 "(^(?!de|en).)*"
以某种神秘的方式实现的,以确保 de 和 en 都不会出现在 "es|ca|eu" 项。
^ # line beginning
.* # any character repeated any number of times, including 0
?! # negative look-ahead assertion
此外,我还添加了一项检查,检查是否已使用 SSL 来实现一次重定向中的语言和 SSL 切换。
使用 return(synth(850, "Moved permanently"));
,您可以在 vcl_synth 中保存一个 if 子句,这将大大减少您的配置,尤其是当您必须执行许多基于语言的重定向时。
sub vcl_recv {
if (req.http.X-Forwarded-Proto !~ "(?i)https" && req.http.Accept-Language ~ "^((?!de|en).)*(es|ca|eu)" {
set req.http.x-redir = "https://spanish.es/" + req.url;
return(synth(850, "Moved permanently"));
}
}
sub vcl_synth {
if (resp.status == 850) {
set resp.http.Location = req.http.x-redir;
set resp.status = 301;
return (deliver);
}
}