我有一个使用 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 标头以确定您是否位于代理后面。由于这些可能被上游代理欺骗和/或添加,因此您应该:
- 在 varnish VCL 中,从请求中删除所有 X-Forwarded-By 标头,然后重新添加您自己的 OR
- 添加自定义标头(例如: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/";
}
...
}