2015-03-16 3 views
0

Я новичок в лаке. Редактируя подпрограмму backend selector, я обнаружил, что искал образец раннего возврата в файлах конфигурации Varnish.Лак, пользовательская подпрограмма с ранним выходом

sub select_backend { 
    if (req.http.host ~ "tracking\..*") { 
    set req.backend = tracking; 
    } 

    if (req.http.host ~ "myapp1.domain.com") { 
    if (req.url ~ "^/insecure/path") { 
     error 403 "Forbidden"; 
    } 
    set req.backend = app1; 
    } 

    if (req.http.host ~ "myapp2.domain.com") { 
    set req.backend = app2; 
    } 
} 

sub vcl_recv { 
    // other stuffs 
    call select_backend; 
} 

Без надлежащего заявления возвращения/выхода существует риск (как файл становится все более и более сложным) в два раза изменить бэкенд. Возможно ли использовать шаблон раннего возврата, чтобы избежать этого? Если нет, то как мне избежать шаблона if/elseif, не теряя при этом производительность?

ответ

2

В настоящее время не существует хороший способ сделать это, как Syntax part of VCL Basics объясняет:

«возвращение» заявление VCL возвращает управление от состояния двигателя VCL лакировать. Если вы определите свою собственную функцию и вызовете ее из одной из функций по умолчанию, набрав «return (foo)», вы не вернете выполнение из вашей пользовательской функции функции по умолчанию, а верните выполнение из VCL в Larnish. Вот почему мы говорим, что VCL имеет завершающие утверждения, а не традиционные возвращаемые значения.

Some other people был схожие потребности и рекомендации были:

if (req.http.host ~ "tracking\..*") { 
    set req.backend = tracking; 
    } elsif (req.http.host ~ "myapp1.domain.com") { 
    if (req.url ~ "^/insecure/path") { 
     error 403 "Forbidden"; 
    } 
    set req.backend = app1; 
    } elsif (req.http.host ~ "myapp2.domain.com") { 
    set req.backend = app2; 
    } 

Если вы держите шаблон if .. elsif не должна быть никаких возможностей для установки резервных два раза. Если вы оставите отдельные блоки if { }, это может произойти.