#php #redirect #http-status-code-301 #varnish
#php #перенаправление #http-status-code-301 #varnish
Вопрос:
Мы используем varnish в качестве нашего балансировщика нагрузки (среди прочего), но в данный момент мы получаем какое-то странное поведение.
У нас есть скрипт, который вызывается с некоторыми параметрами, и в зависимости от того, какие параметры вы передаете, вы перенаправляетесь в другое место с помощью перенаправления 301 (это делается с помощью php-скрипта и функции header())
Проблема в том, что при первом вызове URL-адреса begin происходит перенаправление 301, но затем при следующем вызове того же URL-адреса вы получаете статус 200 OK, перенаправление не происходит и отображается только белая страница.
Я добавил session_start() в начало php-скрипта, чтобы попытаться остановить varnish от кэширования страницы, но пока ничего не помогло.
Я провел некоторое исследование по этой проблеме и увидел, что несколько человек сталкиваются с одной и той же проблемой, но я пока не смог найти решение.
Как я могу заставить varnish прекратить кэширование страницы?
Любая помощь в правильном направлении будет оценена.
Ответ №1:
Не могли бы вы исключить этот URL-адрес из кэша varnish?
Добавьте что-то вроде следующего в ваш default.vcl (или как там называется ваш файл конфигурации varnish).
sub vcl_recv {
if(req.url ~"^/thatpagethatredirects") {
return (pass);
}
}
Это должно остановить кэширование varnish этого URL.
Комментарии:
1. ОБНОВЛЕНИЕ: заметил, что вопрос все еще остался без ответа, принял этот ответ как правильный, поскольку это был шаг в правильном направлении
Ответ №2:
Вы можете попробовать найти URL-адрес, на который перенаправляется varnish, и добавить к нему строку запроса со случайно сгенерированным номером.
Пример:
<?php
$random_number = rand(10000, 99999999);
// This is what the redirect code MIGHT look like, but I doubt it.
header("Location: http://www.example.com/index.php?cache=$random_number");
?>
Если вы можете найти, где страница на самом деле выполняет перенаправление, и вы добавляете строку запроса со случайным числом, это должно исправить ситуацию. Я использовал этот метод, чтобы убедиться, что изображения не кэшируются в прошлом, и он всегда работал для меня отлично.
О, и если вы не можете найти код перенаправления, который varnish использует сам. Вы можете попробовать добавить это на страницу, которую varnish загружает после перенаправления 301:
<?php
$random_number = rand(10000, 99999999);
header("Location: NAME_OF_THIS_SCRIPT.php?cache=$random_number");
?>
В значительной степени та же идея, просто требует меньше поиска. Я не уверен, что это нарушит функцию балансировки нагрузки varnish.
Комментарии:
1. Проблема в том, что php-скрипт никогда не вызывается снова после первого раза, поскольку varnish кэширует его, он больше не вызывает PHP-файл, поэтому rand(), уничтожающий кэш, никогда не будет вызван 🙁
2. Хммммм, возможно, попробуйте просто отключить varnish на данный момент. Вероятно, лучше, чтобы ваш сайт работал без кэширования, чем вообще не работал. В любом случае, как называется ваш сайт? Возможно ли, что это просто не работает для вас? http://www.gossamer-threads.com/lists/varnish/misc/15311 — Отредактируйте файл VCL, чтобы передать его вашему домену. Я сам никогда не использовал varnish, но, похоже, это единственный способ исправить это прямо сейчас.
Ответ №3:
Это довольно неудобно и должно работать корректно по умолчанию. Можете ли вы сказать нам, какую версию Varnish вы используете и создали ли вы пользовательский файл vcl?
Вероятно, ошибка была введена в vcl_fetch. Это должно проверять кешируемость с помощью таких проверок, как:
sub vcl_fetch {
...
if (req.status >= 300 ) {
return pass;
}
if ( ! obj.cacheable ) {
return pass;
}
..
}