2014-11-19 2 views
1

У меня есть следующий код snip-it для Varnish 2, который включает только подмножество полей в его хэш-логике.Как переопределить метод vcl_hash в лаке 4

sub vcl_hash { 
    set req.http.temp = regsub(req.url, "^.*[?&](q=[^&]*).*$", "\1"); 
    set req.http.temp2 = regsub(req.url, "^.*[?&](limit=[^&]*).*$", "\1"); 
    set req.http.temp3 = regsub(req.url, "^.*[?&](classes=[^&]*).*$", "\1"); 
    set req.http.temp3 = regsub(req.url, "^.*[?&](offset=[^&]*).*$", "\1"); 
    set req.hash += req.http.temp; 
    set req.hash += req.http.temp2; 
    set req.hash += req.http.temp3; 
    set req.hash += req.http.temp4; 
    return(hash); 
} 

Как этот код для работы с Varnish 4?

ответ

3

Вы можете использовать встроенную функцию hash_data

Сначала вызовите функцию hash_data с URL, но без строки запроса. Затем снова вызовите функцию hash_data для каждого поля, которое вы хотите добавить в логику хэша.

Вы должны закончить с чем-то вроде этого:

sub vlc_hash { 
    hash_data(__YOUR_REQUEST_WITHOUT_QUERY_STRING__); 
    hash_data(regsub(req.url, "^.*[?&](q=[^&]*).*$", "\1")); 
    hash_data(regsub(req.url, "^.*[?&](limit=[^&]*).*$", "\1")); 
    hash_data(regsub(req.url, "^.*[?&](classes=[^&]*).*$", "\1")); 
    hash_data(regsub(req.url, "^.*[?&](offset=[^&]*).*$", "\1")); 
    return (lookup); 
} 

Обратите внимание, что ваша vlc_hash функция должна возвращать lookup, чтобы прервать выполнение по умолчанию VCL.

Вы можете прочитать документацию хеширования логики Varnish 4 по следующему адресу https://www.varnish-cache.org/docs/4.0/users-guide/vcl-hashing.html

+0

Я помню, пытался что-то почти идентичное этому. Единственное, что я пропустил, это часть hash_data (__ YOU_REQUEST_WITHOUT_QUERY_STRING__). Тем не менее, я никогда не смог бы получить хэш, чтобы игнорировать остальные URL. Может быть, есть какая-то ошибка в версии, которую я использую? – HappyCoder86

+0

Какое основное и второстепенное количество версии вы используете? –

Смежные вопросы