Если необходимо записать в %windir%\system32\macromed\flash
из сценария было бы намного лучше использовать компьютерный сценарий запуска.
У обычного пользователя обычно не будет доступа для записи к той папке.
Вы можете также предпочтения Групповой политики для копирования файлов на машины, если Вы только заботитесь о Windows 7?
req.hash_always_miss
должно помочь.
Не выполняйте полную очистку кеша в начале запуска паука. Вместо этого просто установите работу паука - и в вашем vcl_recv
установите запросы паука так, чтобы они всегда пропускали поиск в кэше; они получат новую копию из бэкэнда.
acl spider {
"127.0.0.1";
/* or whereever the spider comes from */
}
sub vcl_recv {
if (client.ip ~ spider) {
set req.hash_always_miss = true;
}
/* ... and continue as normal with the rest of the config */
}
Пока это происходит и пока новый ответ не будет в кэше, клиенты будут продолжать беспрепятственно получать старый кеш, обслуживаемый им (пока он все еще находится в пределах его TTL).
Ответ Шейна выше лучше, чем этот. Это альтернативное решение, более сложное и имеющее дополнительные проблемы. Пожалуйста, проголосуйте за ответ Шейна, а не за этот. Я просто показываю другой метод решения проблемы.
Моей первоначальной мыслью было return (pass);
в vcl_recv
, а затем, после получения запроса, в vcl_fetch
, каким-то образом проинструктировать Varnish о том, что он должен кэшировать объект, даже если он был специально передан ранее.
Оказывается, это невозможно :
Если вы решили передать запрос в более ранней функции VCL (например: vcl_recv), вы по-прежнему будете выполнять логику vcl_fetch, но объект не войдет в кеш, даже если вы укажете время кеширования.
Итак, следующий лучший вариант - запустить поиск, как обычный запрос, но убедитесь, что он всегда терпит неудачу. Невозможно повлиять на процесс поиска, поэтому он всегда будет попадать (при условии, что он кэшируется ; если это не так, то он все равно пропустит и сохранит). Но мы можем повлиять на vcl_hit
:
sub vcl_hit {
# is this our spider?
if (req.http.user-agent ~ "Wget" && client.ip ~ spider) {
# it's the spider, so purge the existing object
set obj.ttl = 0s;
return (restart);
}
return (deliver);
}
Мы не можем заставить его не использовать кеш, но мы можем очистить этот объект из кеша и перезапустить весь процесс. Теперь он возвращается к началу, в vcl_recv
, где в конечном итоге выполняет еще один поиск. Поскольку мы очистили объект, который уже пытаемся обновить, он пропустит, затем получит данные и обновит кеш.
Немного сложно, но работает. Единственное окно для пользователя, застрявшего между очисткой и сохранением ответа, - это время для обработки одного запроса. Не идеально, но неплохо.