将条件重写为目标 V​​ia: Varnish 1.1

将条件重写为目标 V​​ia: Varnish 1.1

我有一个使用 Varnish 的 Drupal 网站。我试图在人们/node通过 Varnish 查看网站时重定向到以 开头的 URL。

我已在 .htaccess 文件中尝试以下操作但出现 500 错误。

RewriteCond %{HTTP:Via} =1.1 varnish
RewriteRule ^node / [R=301,NC,L]

我无法使用谷歌找到有关如何定位标题的“Via”部分的任何信息。

欢呼吧,保罗

答案1

我没有在这里安装 Varnish 进行测试,但我觉得你没有在 RewriteCond 中转义纯文本。该模式始终被视为正则表达式,因此空格和句点具有特殊含义。尝试:

RewriteCond %{HTTP:Via} =1\.1\ varnish
RewriteRule ^node / [R=301,NC,L]

顺便说一句,这样做有点麻烦。通常,您会检查 X-Forwarded-By 标头以确定您是否位于代理后面。由于这些可能被上游代理欺骗和/或添加,因此您应该:

  1. 在 varnish VCL 中,从请求中删除所有 X-Forwarded-By 标头,然后重新添加您自己的 OR
  2. 添加自定义标头(例如:X-Real-Forwarded-By)并检查其是否存在于您的 .htaccess 中

答案2

因为 Varnish 并非旨在做到这一点,所以您必须使用一些技巧。

发送 HTTP 重定向的最佳方法是准备一个特定的错误处理程序,并根据您的要求引发该错误处理程序。

步骤 1)准备一个错误处理程序来发送重定向

sub vcl_error {
  ...
  # redirect
  if (obj.status == 750) {
    set obj.status = 301;
    set obj.http.Location = "http://www.error-location.com/";
    return (deliver);
  }
  ...
}

步骤 2)引发准备好的错误处理程序

sub vcl_recv {
  ...
  # raise error if someone requests /node
  if (req.url ~ "^/node") {
    error 750;
  }
  ...
}

或者,你可以设置错误处理程序以使用动态目标

sub vcl_error {
  ...
  # redirect to dynamic target
  if (obj.status == 750) {
    set obj.status = 301;
    set obj.http.Location = obj.response;
    return (deliver);
  }
  ...
}

...

sub vcl_recv {
  ...
  # redirect, if someone requests /node
  if (req.url ~ "^/node") {
    error 750 "http://www.error-location.com/";
  }
  ...
}

相关内容