重写条件目标通过:清漆1.1

我有一个使用清漆的Drupal网站。 我正尝试redirect以/node开头的URL,当他们通过Varnish查看站点时。

我已经在.htaccess文件中尝试了以下,但它有500个错误。

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

我一直没能find任何使用谷歌有关如何定位标题的“通过”部分。

干杯,保罗

我没有在这里安装Varnish来testing,但在我看来,你并不是逃避你的RewriteCond中的纯文本。 该模式总是被认为是一个正则expression式,所以空间和句点都有特殊的意义。 尝试:

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

顺便说一句,这是一个混乱的方式做事情。 通常你会检查X-Forwarded-By头来确定你是否在代理之后。 由于这些可能被上游代理欺骗和/或添加,您应该:

  1. 在清漆VCL中,从请求中删除所有的X-Forwarded-By标题并重新添加你自己的OR
  2. 添加一个自定义标题(例如:X-Real-Forwarded-By)并检查它是否存在于你的.htaccess中

因为Varnish不打算这样做,所以你必须使用一些小技巧。

对于发送HTTPredirect,最好的方法是准备一个特定的error handling程序,并根据您的要求提出这个error handling程序。

步骤1)准备一个error handling程序来发送redirect

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

步骤2)提高准备好的error handling程序

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

或者,您可以设置error handling程序以使用dynamic目标

 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/"; } ... }