Назад | Перейти на главную страницу

Я думаю, что Varnish удаляет мои параметры строки запроса

На нашем сайте WordPress есть несколько представлений для каждой страницы и публикации в зависимости от того, используется ли конкретная строка запроса.

Например, если посетили example.com/blog-post-with-chart (страница, которая включает диаграмму в качестве основного содержимого), вы увидите всю страницу. Навигационная панель, контент, нижний колонтитул ... все.

Однако если вы пошли в example.com/blog-post-with-chart/? view = встроить тогда все, кроме диаграммы, будет удалено. Таким образом, вы увидите только график. Это то, как другие сайты могут встраивать наши диаграммы.

WordPress get_query_var('view') ничего не возвращает. Я также попытался просто var_dump или print_r суперглобальный $ _GET, который также ничего не показывает.

Я заметил, что это не работает, только если "view" является первым параметром строки запроса. так что если мой URL example.com/blog-post-with-chart/? fake = arg & view = встраивать тогда вид диаграммы будет работать должным образом.

Похоже, что Varnish не передает аргументы запроса серверу. Если я добавлю параметр запроса «nocache», то все будет работать ожидаемо. И это потому, что у меня есть правило исчезновения:

            if (req.url ~ "nocache") {
                set req.backend = default;
                return(pass);
            }

В качестве обходного пути я добавил новое правило для обхода кеша, если URL-адрес содержит view =

            if ( req.url ~ "view=" ) {
                set req.backend = default;
                return(pass);
            }

Но как мне помешать Varnish "отбрасывать" аргументы запроса? Мы определенно хотим, чтобы эта страница была кэширована, и мы также хотим, чтобы она была кэширована вместе со строкой запроса, чтобы встроенное представление всегда кэшировалось.

EDIT - вот файл VCL, который я использую: https://gist.github.com/kyle-jennings/589e513808fa83b93a27d1cf3c10c642

Вы в основном просите varnish очистить каждый аргумент запроса, если в начале строки запроса есть "представление":

      if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
                set req.url = regsub(req.url, "\?.*$", "");
      }

Итак ... это соответствует