如何在 Varnish 4 中强制使用 SSL

如何在 Varnish 4 中强制使用 SSL

我的目标是使用 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, ""));
        }
}

相关内容