Varnish :如果响应为404,则重写URL

标签 varnish varnish-vcl fastly

我很好奇,如果在Varnish 2.1.5中,如果响应是404,是否可以重写URL?

例如。我想提取一个URL,该URL可能存在也可能不存在。如果URL不存在,我想重写URL,然后尝试新的URL。

我是Varnish的新手,并不完全了解请求的生命周期(如果有人认识这篇文章的人,请分享)。

我试过设置一些变量和请求 header ,并检查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
然后尝试/page代替
如果/page不存在
然后404

最佳答案

我正在写这个作为答案,否则它会看起来像评论一样愚蠢。
请记住,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);

关于 Varnish :如果响应为404,则重写URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44642621/

相关文章:

varnish - 如何使用supervisord配置ulimit(启动varnish)

load-balancing - 客户服务主任的Varnish会将流量发送到不健康的后端吗?

varnish - 如何使用 Varnish 缓存忽略特定的查询参数?

varnish - 在编写自定义 Varnish 模块时如何记录错误?

amazon-web-services - AWS ELB 从 FaSTLy 健康检查中获得大量 404 错误

caching - Varnish 4 VCL- strip 定义的查询字符串参数

apache2 - N个过期对象的数量很高。为什么? -(里面是我的varnishstat和default.vcl)

caching - 您如何测试 Varnish 配置或一般的缓存层

load-balancing - 如何将 Traefik 服务状态公开为 HTTP 端点?

varnish - 在 url/page/b Varnish 上显示来自/page/a 的内容