Лак не игнорирует поддомен, несмотря на правила vcl

#apache #caching #reverse-proxy #varnish #varnish-vcl

#apache #кэширование #обратный прокси #varnish #varnish-vcl

Вопрос:

Я использую базовый сервер lamp с apache на порту 80 и varnish на порту 81. Я пытаюсь полностью исключить поддомен основного сайта, однако до сих пор мне это не удавалось, и я не уверен, почему.

Как вы можете видеть ниже, у меня есть правило: А) пропускать зарегистрированных пользователей в поддомене и Б) полностью пропускать поддомен. Однако, похоже, ни одно из них не работает. Что-то не так с моей конфигурацией vcl?

 backend default {
.host = "my.server.ip.address";
.port = "80";
}



sub vcl_recv {
call identify_device;

    # Allow the back-end to serve up stale content if it is responding slowly.
    set req.grace = 2m;

    # Always cache the following file types for all users.
    if ( req.url ~ "(?i).(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(?[a-z0-9] )?$" ) {
            unset req.http.cookie;
    }

    # Don't serve cached pages to logged in users
    if ( req.http.cookie ~ "wordpress_logged_in" || req.url ~ "vaultpress=true" ) {
            return( pass );
    }

    #Lets skip the logged in users on subdomain too!
    if ( req.http.cookie ~ "dmr_user" ) {
    return (pass);
    }

    #skip subdomain.domain.com
    if (req.http.host ~ "subdomain.domain.com") {
    return (pass);
    }

    #Following for WooCommerce and comments
    if (req.url ~ "^/(cart|my-account|checkout|addons|wp-comments-post)") {
    return (pass);
    }

    #Lets skip the logged in users on entries too!
    if ( req.http.cookie ~ "dmr_user" ) {
    return (pass);
    }

    if ( req.url ~ "?add-to-cart=" ) {
     return (pass);
     }

    # Drop any cookies sent to WordPress.
    if ( ! ( req.url ~ "wp-(login|admin)" ) ) {
            unset req.http.cookie;
    }        

}

sub vcl_fetch {


if (beresp.ttl < 180s) {
set beresp.ttl = 180s;
}
    if (!(req.url ~ "wp-(login|admin)")) {
            unset beresp.http.set-cookie;
    }

}

sub vcl_hash {
    hash_data(req.http.X-Device);
}


sub vcl_deliver {
    if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT";
    } else {
            set resp.http.X-Cache = "MISS";
    }

}
 

Ответ №1:

Вы пропускаете обработку поддомена только на полпути к своей обработке, т. Е. Инструкции выполняются по порядку. Перемещение проверки пропуска домена непосредственно в начало sub vcl_recv должно гарантировать, что никакие другие правила не выполняются против запросов к этому поддомену.

Комментарии:

1. Отличный звонок @marcel! Так просто. Если это сработает, мне, возможно, придется пойти промочить голову. Я проведу тестирование всего через несколько дней.

Ответ №2:

Что ж, ребята, оказывается, все, что мне было нужно, — это использовать pipe вместо pass.

 #skip subdomain.domain.com
if (req.http.host ~ "subdomain.domain.com") {
return (pass);
}
 

теперь

 #skip subdomain.domain.com
if (req.http.host ~ "subdomain.domain.com") {
return (pipe);
}
 

Я также пошел дальше и переместил его в верхнюю часть конфигурации. В целом, теперь это работает как заклинание. Спасибо всем за помощь!