我的目标是使用 Varnish 将客户端重定向到 SSL 版本的网站。在 Varnish 3 中,可以通过 VCL 中的以下操作来实现:
sub vcl_recv {
if ( (req.http.host ~ "^(?i)somesite.org" || req.http.host ~ "^(?i)www.somesite.org")
&& req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.x-Redir-Url = "https://www.somesite.org" + req.url;
error 750 req.http.x-Redir-Url;
}
}
sub vcl_error {
if (obj.status == 750) {
set obj.http.Location = obj.response;
set obj.status = 302;
return (deliver);
}
Varnish 版本 3 和 4 之间对 vcl 要求进行了更改,这些可以在 varnish 文档中找到:https://www.varnish-cache.org/docs/4.0/whats-new/upgrading.html#changes-to-vcl。
我尝试使用 Varnish 4 版本的重定向,结果出现了重定向循环。我不确定是不是 vcl 的这个部分不正确,或者即使正确的实现也适用于我当前的设置。
无论如何,拥有一个确认有效的 ?Varnish 4 版本是有用的。我的尝试是:
sub vcl_recv {
if ( (req.http.host ~ "^(?i)somesite.org" || req.http.host ~ "^(?i)www.somesite.org")
&& req.http.X-Forwarded-Proto !~ "(?i)https") {
set req.http.x-Redir-Url = "https://www.somesite.org" + req.url;
return (synth(750, req.http.x-Redir-Url));
}
}
sub vcl_synth {
if (resp.status == 750) {
set resp.http.Location = resp.reason;
set resp.status = 302;
return (deliver);
}
有谁熟悉这个并且能够发现它是正确还是不正确?
答案1
在使用相应的值更新 TLD 时,请尝试对 Varnish 4 执行以下操作:
sub vcl_recv {
if ( (req.http.host ~ "^(?i)www.domain.com") && req.http.X-Forwarded-Proto !~ "(?i)https") {
return (synth(750, ""));
}
}
sub vcl_synth {
if (resp.status == 750) {
set resp.status = 301;
set resp.http.Location = "https://www.domain.com" + req.url;
return(deliver);
}
}
您应该能够保留该||
声明并且它应该可以工作(未经测试):
sub vcl_recv {
if ( (req.http.host ~ "^(?i)www.domain.com" || req.http.host ~ "^(?i)domain.com") && req.http.X-Forwarded-Proto !~ "(?i)https") {
return (synth(750, ""));
}
}