如何在 Varnish 4 中强制实施 SSL

Tay*_*aff 6 ssl varnish

我的目标是使用 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);
    }
Run Code Online (Sandbox Code Playgroud)

在 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);
    }
Run Code Online (Sandbox Code Playgroud)

有没有人熟悉这个并且能够发现它是正确的还是不正确的?

Ast*_*ron 7

在使用您各自的值更新 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该能够保留该||语句并且它应该可以工作(未测试):

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, ""));
        }
}
Run Code Online (Sandbox Code Playgroud)