0

在某些情况下,我想设置 Varnish 2.1.5 规则以显示来自另一个页面的内容,但保持原始 URL 不变。

例如,当用户请求时/page/a,将显示他/她/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);
  }

我假设,而不是set obj.http.Location "https://site/page/a";,我需要以某种方式将请求发送回vcl_recv然后使用regsub()

我该怎么做呢?

4

1 回答 1

2

应该很简单:

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);
    }
}
于 2017-07-10T19:54:11.683 回答