Назад | Перейти на главную страницу

Как применить SSL в Varnish 4

Я стремлюсь перенаправить клиентов на SSL-версию сайта с помощью Varnish. В 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);
    }

Кто-нибудь знаком с этим и может определить, правильно это или нет?

Попробуйте выполнить следующие действия для Varnish 4 при обновлении TLD соответствующими значениями:

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, ""));
        }
}