Заголовки Cache-Control на сайте Cloudflare Workers

Я просто тестирую рабочие сайты с помощью статического сайта, созданного Hugo. Он уже существует, поэтому я воспользовался инструкциями из документации для адаптации существующего сайта. Заголовки cache-control для файлов woff2 и css отображаются с no-cache, вопреки тому, что я ожидал, основываясь на https://support.cloudflare.com/hc/en-us/articles/200172516#h_a01982d4-d5b6-4744-62c160a71 . Рассматриваемый сайт Workers - https://hosts-test-hugo.brycewray.workers.dev/.

Я нашел следующее на https://levelup.gitconnected.com/use-cloudflare-javascript-workers-to-deploy-you-static-generated-site-ssg-1c518e078646, но не знаю, связано ли это:

Cloudflare Worker - это фрагмент кода JavaScript, который запускается каждый раз, когда вы получаете доступ к определенному маршруту на веб-сайте, проксируемом Cloudflare. Код выполняется по каждому запросу до попадания в кеш Cloudflare. Это означает, что ответы Worker не кэшируются (хотя запросы, сделанные Worker к другим веб-службам, могут кэшироваться с соответствующими заголовками кеширования).

Должен ли сайт иметь собственный домен - то есть, а не быть URL-адресом «.workers.dev» - прежде, чем он будет иметь нормальное поведение кэширования? Это вообще связано?

[Примечание: я публикую это здесь, потому что мне не удалось получить ответ на форум сообщества Cloudflare или Cloudflare subreddit - надеемся на лучшие результаты здесь.]


person Bryce Wray    schedule 08.10.2020    source источник
comment
Я пытался посетить ваш сайт, но не вижу cache-control: no-cache ни в одном из полученных мной ответов. В частности, файлы css и woff2, похоже, вообще не имеют заголовка управления кешем, но cf-cache-status показывает, что они кэшируются Cloudflare. В каком контексте вы видите no-cache?   -  person Kenton Varda    schedule 10.10.2020
comment
@KentonVarda Я вижу это в заголовках запросов в Chrome DevTools. Я полагаю, проблема в том, почему в разделе Заголовки ответа нет заголовка cache-control. Я вижу аналогичные результаты на других сайтах, которые, как мне известно, являются сайтами рабочих. Однако: теперь, после многих часов дополнительного поиска, чем я уже делал, я нахожу больше информации (на сайте CF и за его пределами), которая лучше объясняет это. Спасибо за ответ, сэр.   -  person Bryce Wray    schedule 11.10.2020


Ответы (2)


По умолчанию на рабочих сайтах не отображается заголовок Cache-Control, но вы можете настроить его для этого. (ИЗМЕНИТЬ, чтобы уточнить: рабочие сайты по умолчанию кэшируются на стороне Cloudflare и поддерживают etags для повторной проверки. Заголовок Cache-Control определяет, кэшируются ли они также в браузере. без повторной валидации.)

Обратите внимание, что рабочие сайты работают совсем не так, как Cloudflare с классическим исходным сервером. Если вы читаете что-то о кешировании в Cloudflare, но в нем конкретно не упоминаются рабочие сайты, то, вероятно, это не относится к рабочим сайтам.

С Workers Sites ваш сайт обслуживается Cloudflare Worker - кодом, который запускается непосредственно на серверах Cloudflare. Итак, у вас нет исходного сервера за Cloudflare, и кеш Cloudflare не работает нормально. Код Worker полностью отвечает за обслуживание контента, включая установку любых заголовков, таких как Cache-Control.

Фактически, когда вы создаете новый проект Workers Sites с помощью wrangler, код для этого Worker создается для вас, но вы можете его редактировать! Вы можете настроить код все, что хотите, делать все, что хотите. Код для Worker находится в каталоге вашего проекта в workers-site/index.js. Код выглядит так - - фактически, он инициализируется как копия этого файла с GitHub.

Этот рабочий код зависит от библиотеки (модуля npm), называемой @cloudflare/kv-asset-handler, для выполнения большей части Работа. Эту библиотеку можно настроить для обработки кэширования различными способами с помощью параметра cacheControl.

Но где установить эту опцию? Что ж, в вашем рабочем коде!

Откройте workers-site/index.js и найдите часть, которая выглядит так:

async function handleEvent(event) {
  const url = new URL(event.request.url)
  let options = {}

  /**
   * You can add custom logic to how we fetch your assets
   * by configuring the function `mapRequestToAsset`
   */
  // options.mapRequestToAsset = handlePrefix(/^\/docs/)

В комментарии упоминается один из способов, которым вы можете использовать options для настройки обслуживания вашего сайта, но вы также можете указать здесь cacheControl. Попробуйте добавить это:

  options.cacheControl = {
    browserTTL: 3600      // 1 hour
  }

Теперь повторно разверните свой сайт, и вы должны увидеть, что ресурсы обслуживаются с помощью Cache-Control: max-age=3600. Конечно, это означает, что ваш контент может кэшироваться в браузерах людей до часа (3600 секунд); вы можете предпочесть более длительный или более короткий период.

Обратите внимание: если вы не программист, все это может показаться немного сложным. Рабочие сайты действительно предназначены для людей, которые хотят иметь возможность настраивать обслуживание своих сайтов, редактируя код JavaScript. Для тех, кто не заинтересован в написании кода, вы будете ограничены поведением по умолчанию, которое может соответствовать вашим потребностям, а может и не соответствовать.

person Kenton Varda    schedule 11.10.2020

Еще раз спасибо Кентону Варде из Cloudflare за его ответ, без которого я бы полностью застрял. Я также благодарен Брайану Ли за дополнительную и не менее ценную помощь, которую он оказал отдельно.

Добавляем следующее для тех, кому это может пригодиться. . .

Оставшаяся проблема, с которой я столкнулся, заключалась в том, что я не знал, как назначать разные значения cache-control (например, один месяц или 2592000) большинству статических ресурсов, оставляя HTML с гораздо меньшим значением (например, 3600 или 0). Затем, несколько дней спустя, я нашел ответ в комментарии в выпуске №81 репозитория Cloudflare KV-Asset-Handler. Итак, теперь у меня есть следующий код в index.js файле моего Worker'а:

  options.cacheControl = {
    browserTTL: 0,
    edgeTTL: 0,
    bypassCache: false // default
  }

  const filesRegex = /(.*\.(ac3|avi|bmp|br|bz2|css|cue|dat|doc|docx|dts|eot|exe|flv|gif|gz|ico|img|iso|jpeg|jpg|js|json|map|mkv|mp3|mp4|mpeg|mpg|ogg|pdf|png|ppt|pptx|qt|rar|rm|svg|swf|tar|tgz|ttf|txt|wav|webp|webm|webmanifest|woff|woff2|xls|xlsx|xml|zip))$/

  if(url.pathname.match(filesRegex)) {
    options.cacheControl.edgeTTL = 2592000
    options.cacheControl.browserTTL = 2592000
  }

Если вы посмотрите на этот связанный комментарий к проблеме и задаетесь вопросом, в чем разница: единственное, что я удалил html (и, на всякий случай, htm) из списка расширений. В результате HTML моего рабочего сайта не кэшируется, в то время как для каждого файла CSS, шрифта или изображения установлен cache-control месячный cache-control параметр - именно это и есть желаемый результат. Примечание. Подавляющее большинство изображений на сайте размещено в других местах, но я все еще размещаю небольшое количество изображений для значков и резервных объявлений в целом.

person Bryce Wray    schedule 10.10.2020
comment
Чтобы было ясно, когда вы обслуживаете сайт с помощью рабочих сайтов, все работает совсем иначе, чем когда вы используете Cloudflare перед обычным исходным сервером. Я думаю, что ваши ссылки на самом деле не имеют отношения к рабочим сайтам. Похоже, проблема здесь только в том, что рабочие сайты не отправляют никаких cache-control: max-age. Мне это действительно кажется ошибкой на рабочих сайтах. Вы можете отредактировать JavaScript в worker-site / index.js, чтобы добавить в него заголовки для управления кешем, но мы, вероятно, должны исправить это и в шаблоне по умолчанию. - person Kenton Varda; 11.10.2020
comment
Хорошо, похоже, что функциональность есть, просто она не включена по умолчанию. Я отправлю ответ, как его включить ... - person Kenton Varda; 11.10.2020
comment
@KentonVarda Очень признателен! - person Bryce Wray; 11.10.2020