在 url /page/b Varnish 上显示来自 /page/a 的内容
Show content from /page/a on url /page/b Varnish
我想设置 Varnish 2.1.5 规则以在某些情况下显示来自另一个页面的内容,但保持原始 URL 不变。
例如,当用户请求 /page/a
s/he 时,将显示 /page/b
,但仍会在浏览器中看到 /page/a
URL。
我需要这个特定的用例来优雅地处理翻译页面上的 404 错误。我不确定如何将请求发送回 vcl_recv
据我了解,生命周期流程和当前逻辑如下所示:
sub vcl_recv {
if(req.http.cookie ~ "lang_pref") {
# Redirect to Preferred Language
error 999 "i18n cookie";
}...
sub vcl_deliver {
if (resp.status == 999 ) {
set resp.status = 302;
set resp.response = "Found";
}... # more i18n logic
sub vcl_fetch {
# Set Varnish error if backend cant find requested i18n page
if (beresp.status == 404 && req.url ~ "^\/(en|fr|de)(\/.*)?$") {
error 494;
}...
sub vcl_error {
# Double check i18n pages for English before 404
if (obj.status == 494) {
set obj.http.Location = "https://site/page/a";
}
set obj.status = 302;
return(deliver);
}
我的假设是,我需要以某种方式将请求发送回 vcl_recv
,而不是 set obj.http.Location "https://site/page/a";
,然后使用 regsub()
。
我该怎么做?
应该很简单:
sub vcl_error {
# Double check i18n pages for English before 404
if (obj.status == 494 && req.url == "/page/a") {
set req.url = "/page/b";
return(restart);
}
}
我想设置 Varnish 2.1.5 规则以在某些情况下显示来自另一个页面的内容,但保持原始 URL 不变。
例如,当用户请求 /page/a
s/he 时,将显示 /page/b
,但仍会在浏览器中看到 /page/a
URL。
我需要这个特定的用例来优雅地处理翻译页面上的 404 错误。我不确定如何将请求发送回 vcl_recv
据我了解,生命周期流程和当前逻辑如下所示:
sub vcl_recv {
if(req.http.cookie ~ "lang_pref") {
# Redirect to Preferred Language
error 999 "i18n cookie";
}...
sub vcl_deliver {
if (resp.status == 999 ) {
set resp.status = 302;
set resp.response = "Found";
}... # more i18n logic
sub vcl_fetch {
# Set Varnish error if backend cant find requested i18n page
if (beresp.status == 404 && req.url ~ "^\/(en|fr|de)(\/.*)?$") {
error 494;
}...
sub vcl_error {
# Double check i18n pages for English before 404
if (obj.status == 494) {
set obj.http.Location = "https://site/page/a";
}
set obj.status = 302;
return(deliver);
}
我的假设是,我需要以某种方式将请求发送回 vcl_recv
,而不是 set obj.http.Location "https://site/page/a";
,然后使用 regsub()
。
我该怎么做?
应该很简单:
sub vcl_error {
# Double check i18n pages for English before 404
if (obj.status == 494 && req.url == "/page/a") {
set req.url = "/page/b";
return(restart);
}
}