Varnish:如果响应是 404,重写一个 URL
Varnish: Rewrite a URL if response is 404
我很好奇是否有办法在 Varnish 2.1.5 中重写 URL 如果响应是 404?
例如。我想调出一个 URL,它可能存在也可能不存在。如果 URL 不存在,我想重写 URL 并尝试使用新的 URL。
我是 Varnish 的新手,并不完全了解请求的生命周期(如果有人知道解释这一点的文章,请分享)。
我试过设置一些变量和请求 headers,并检查 res.status
但它们似乎在生命周期的某个地方丢失了,无论如何页面 404s:
if (req.http.cookie ~ "lang_pref"
&& resp.status == 404
&& req.url ~ "^\/(en|fr|de)(\/.*)?$"
) {
set resp.http.Location = "https://" req.http.host regsub(req.url, "^\/(en|fr|de)\/","/");
}
用例是针对已翻译的网站。例子
网站。com/french/page 可能存在也可能不存在
如果 /French/page 响应 404
然后尝试 /page 代替
如果 /page 不存在
然后404
我正在写这个作为答案,否则它作为评论看起来会很愚蠢。
请记住,301 是永久移动的,302 是临时移动的。
您也可以像在 post 中那样调整使用正则表达式。
sub vcl_recv {
if (req.url ~ “^/old/page”) {
return (synth(301, “/new/page”));
}
if (req.url ~ “^/this/oldPage”) {
return (synth(302, “/this/newPage”));
}
}
sub vcl_synth {
if (resp.status == 301 || resp.status == 302) {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
return (deliver);
}
}
更新:解决评论。
sub vcl_error {
if (obj.status == 404) {
set obj.status = 301;
set obj.http.Location = obj.response;
return (deliver);
以下是我用例的最终结果:
sub vcl_fetch {
...
if (beresp.status == 404 && req.url ~ "^\/(en|fr|de)(\/.*)?$") {
error 494;
}
return(deliver);
}
sub vcl_error {
# Double check i18n pages for English before 404
if (obj.status == 494) {
set obj.http.Location = "https://" req.http.host regsub(req.url, "^\/(en|fr|de)\/","/") "?notranslation";
set obj.status = 302;
return(restart);
}
...
}
我很好奇是否有办法在 Varnish 2.1.5 中重写 URL 如果响应是 404?
例如。我想调出一个 URL,它可能存在也可能不存在。如果 URL 不存在,我想重写 URL 并尝试使用新的 URL。
我是 Varnish 的新手,并不完全了解请求的生命周期(如果有人知道解释这一点的文章,请分享)。
我试过设置一些变量和请求 headers,并检查 res.status
但它们似乎在生命周期的某个地方丢失了,无论如何页面 404s:
if (req.http.cookie ~ "lang_pref"
&& resp.status == 404
&& req.url ~ "^\/(en|fr|de)(\/.*)?$"
) {
set resp.http.Location = "https://" req.http.host regsub(req.url, "^\/(en|fr|de)\/","/");
}
用例是针对已翻译的网站。例子
网站。com/french/page 可能存在也可能不存在 如果 /French/page 响应 404 然后尝试 /page 代替 如果 /page 不存在 然后404
我正在写这个作为答案,否则它作为评论看起来会很愚蠢。 请记住,301 是永久移动的,302 是临时移动的。
您也可以像在 post 中那样调整使用正则表达式。
sub vcl_recv {
if (req.url ~ “^/old/page”) {
return (synth(301, “/new/page”));
}
if (req.url ~ “^/this/oldPage”) {
return (synth(302, “/this/newPage”));
}
}
sub vcl_synth {
if (resp.status == 301 || resp.status == 302) {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
return (deliver);
}
}
更新:解决评论。
sub vcl_error {
if (obj.status == 404) {
set obj.status = 301;
set obj.http.Location = obj.response;
return (deliver);
以下是我用例的最终结果:
sub vcl_fetch {
...
if (beresp.status == 404 && req.url ~ "^\/(en|fr|de)(\/.*)?$") {
error 494;
}
return(deliver);
}
sub vcl_error {
# Double check i18n pages for English before 404
if (obj.status == 494) {
set obj.http.Location = "https://" req.http.host regsub(req.url, "^\/(en|fr|de)\/","/") "?notranslation";
set obj.status = 302;
return(restart);
}
...
}