Распакованные файлы Amazon S3 получают неверные метаданные и вызывают ошибку - PullRequest
0 голосов
/ 27 июня 2019

Мои статические файлы обслуживаются с Amazon S3. Я использую окружность для моего CI / CD, чтобы развернуть мои файлы. Файлы добавляются в корзину s3, как и ожидалось, но когда я захожу на статическую ссылку на веб-сайт, я вижу пустую страницу с ошибкой консоли «Uncaught SyntaxError: Неожиданный токен ILLEGAL».

Через некоторое время (см. эту ссылку в качестве одного примера) я обнаружил, что проблема была в метаданных. Файлы js добавляются с типом содержимого application/javascript вместо text/js. Когда я вручную захожу в корзину и нажимаю на отдельные файлы, захожу в «Свойства», затем «Метаданные», удаляю существующий тип контента и добавляю строку Content-Type со значением text/js для всех файлов js gz, веб-сайт начинает отображаться как следует. Единственный файл, который не добавляется в js-файл, это index.html, который получает правильные метаданные (text/html).

Я был очень взволнован тем, что это сработало, когда я переключил тип контента, думая, что решил проблему. Однако при повторном развертывании приложения снова были добавлены те же неверные метаданные. Я нашел одно решение: добавить тег content-type со значением text/js во время развертывания. Это помогло получить правильный тип содержимого, связанный с файлами js.gz, НО файл index.html также развертывается. Так как файл index.html также получил файл text/js, мы получили ошибку «Этот сайт не доступен».

У кого-нибудь есть идеи для решений? Я работаю над поиском способа динамического выбора одного типа контента или другого, но мне интересно, есть ли лучшее решение. Приложение распространяется через CloudFront.

Спасибо за любую помощь!

Это конец моего окружения config.yml, где происходит развертывание:

      - run: sudo apt-get update && sudo apt-get install -y python-dev
      - run: sudo curl -O https://bootstrap.pypa.io/get-pip.py
      - run: sudo python get-pip.py
      - run: sudo pip install awscli --upgrade
      - run: aws --version
      - run: aws s3 ls
      - run: yarn run deploy

Строка yarn run deploy работает следующим образом:

yarn build && aws s3 sync dist/ s3://[bucket] --delete --content-encoding gzip

Обновленная строка, добавленная в content-type:

yarn build && aws s3 sync dist/ s3://[bucket] --delete --content-encoding gzip --content-type text/js

Обновление:

Мне показалось, что я нашел решение, добавив теги для включения или исключения файлов по расширению, как показано ниже.

"deploy-html": "yarn build && aws s3 sync dist/ s3://[bucket name] --exclude *.html --include *.gz --delete --content-encoding gzip --content-type text/js",
"deploy-js": "yarn build && aws s3 sync dist/ s3://[bucket name] --exclude *.js --include *.html --content-encoding gzip --content-type text/html",
"deploy": "yarn build && yarn run deploy-html && yarn run deploy-js"

Однако, в общем, это делает их недоступными, что приводит к ошибке:

Unknown options: server.js,webpack.common.js,webpack.dev.js,webpack.prod.js

1 Ответ

0 голосов
/ 27 июня 2019

Я нашел решение, добавив все и обновив метаданные.

package.json сценарии:

"deploy": "aws s3 sync dist/ s3://dallas-website --delete --content-type text/js --content-encoding gzip",
"update-metadata": "aws s3api copy-object --bucket dallas-website --content-type text/html --copy-source dallas-website/index.html --key index.html --metadata-directive REPLACE"

config.yml шаги:

- run: yarn run build
- run: yarn run deploy
- run: yarn run update-metadata
...