#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);
}
Я также пошел дальше и переместил его в верхнюю часть конфигурации. В целом, теперь это работает как заклинание. Спасибо всем за помощь!