Я тестирую исправленную конфигурацию Varnish, и мне нужно посмотреть, попадают ли определенные URL-адреса в кеш или нет. Кажется, не нравится несколько параметров.

Изменение конфигурации Varnish состоит в том, чтобы не рассматривать URL-адреса с определенными параметрами как уникальное содержимое. Например.

/news/tech
/news/tech?itq=1001
/news/tech?itq=1002&ito=3553

Все должны быть эквивалентны.

Сценарий 1

Запрос страницы, которая еще не была кеширована:

curl -I 'http://example.com/news/tech'

Результат:

X-Varnish-Cache: MISS

Повторная отправка того же запроса дает следующий результат:

X-Varnish-Cache: HIT

Сценарий 2

Повторный запрос указанного выше URL-адреса, но с параметром:

curl -I 'http://example.com/news/tech?itq=1001'

Это один из параметров, который нельзя рассматривать как уникальный контент.

Результат:

X-Varnish-Cache: HIT

Сценарий 3

Запрос со вторым параметром:

curl -I 'http://example.com/news/tech?itq=1001&ito=3553'

Отклик:

X-Varnish-Cache: MISS

Вроде конфиг Varnish работает на? но не для &

Вот соответствующая строка в моей конфигурации Varnish:

  set req.url = regsuball(req.url, "([\?|\&])+(utm_campaign|utm_content|utm_medium|utm_source|utm_term|ITO|et_cid|et_rid|qs|itq|ito|itx\[idio\])=[^&\s]*&?", "\1");

Я предполагаю, что это выполняется только один раз, поэтому несколько параметров не будут удалены. Как бы я это сделал?

0
thirtyish 12 Мар 2015 в 16:41

2 ответа

Лучший ответ

После небольших экспериментов я нашел способ сделать это.

# Strip out query parameters that do not affect the page content
set req.url = regsuball(req.url, "([\?|\&])+(utm_campaign|utm_content|utm_medium|utm_source|utm_term|ITO|et_cid|et_rid|qs|itq|ito|itx\[idio\])=[^&\s]+", "\1");
# Get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
# Replace ?&
set req.url = regsub(req.url, "(\?\&)", "\?");

2-я и 3-я команды - это просто очистка. Но, похоже, это работает.

1
thirtyish 13 Мар 2015 в 13:35

Реализация @thirtyish вызывает проблемы, когда используется с комбинацией дополнительных параметров get.

Например ?utm_campaign=1&utm_source=2&my_add_parameter=3 не работает.

Если мы изменим порядок на ?my_add_parameter=3=utm_campaign=1&utm_source=2, будет работать. Под неработающим я подразумеваю, что он генерирует несколько знаков & в запросе url.

Я обновляю регулярное выражение, чтобы исправить это.

set req.url = regsuball(req.url, "[\?\&](utm_\w+|hsa_\w+|gclid|fbclid|pc)=[^&\s]+", "");
# trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
set req.url = regsub(req.url, "(\?\&)|(\&)", "\?");
0
gskillz 11 Дек 2020 в 13:06