我很好奇,如果在Varnish 2.1.5中响应是404,有没有办法重写网址?
例如。我想提取一个可能存在或可能不存在的URL。如果网址不存在,我想进行网址重写并尝试使用新网址。
我是Varnish的新手并且不完全理解请求的生命周期(如果有人知道解释此问题的文章,请分享)。
我已尝试设置一些变量和请求标头,并检查res.status
但它们似乎在生命周期和页面404中的某个地方丢失了:
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)\/","/");
}
用例适用于翻译网站。实施例
Website.com/french/page可能存在,也可能不存在 如果/ French / page以404响应 然后尝试/页面 如果/页面不存在 然后404
答案 0 :(得分:1)
我写这个作为答案,或者作为评论看起来很傻。 请记住,301会永久移动,302会暂时移动。
您也可以像在帖子中一样调整使用正则表达式。
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);
答案 1 :(得分:1)
以下是最终为我的用例工作的内容:
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);
}
...
}