# Amazon S3 and Cache Control

Перенес свои сайты на Amazon S3 и озадачился проблемой управления кешированием страниц. На обычном сервере все просто, достаточно прописать необходимые директивы в файл `.htaccess` или задать требуемые настройки в конфигурацию nginx.

С S3 bucket несколько сложнее, загрузить объекты на сервер просто, но как управлять их доступом/заголовками? Вот тут на помощь и приходит консольная утилита `s3cmd`.

Раньше для загрузки сайта на сервер S3 я использовал следующую команду:

```shell
$ s3cmd sync -P --delete-removed --no-preserve public/ s3://www.juev.ru/
```

Теперь же у меня используется несколько команд, которые загружают определенные объекты и присваивают им нужные заголовки:

```shell
$ s3cmd sync --acl-public --exclude "*.*" --include "*.png" --include "*.jpg" --include "*.ico" --add-header="Expires: Sat, 20 Nov 2020 18:46:39 GMT" --add-header="Cache-Control: max-age=6048000" --no-preserve public/ s3://www.juev.ru/
$ s3cmd sync --acl-public --exclude "*.*" --include  "*.css" --include "*.js" --add-header="Cache-Control: max-age=604800"  --no-preserve public/ s3://www.juev.ru
$ s3cmd sync --acl-public --exclude "*.*" --include "*.html" --add-header="Cache-Control: max-age=0, private, must-revalidate" --no-preserve public/ s3://www.juev.ru
$ s3cmd sync --acl-public --exclude ".DS_Store" --exclude "assets/" --exclude "js/" --no-preserve public/ s3://www.juev.ru/
$ s3cmd sync --acl-public --delete-removed --no-preserve public/ s3://www.juev.ru/
```

Используемые ключи:

* `--acl-public`, как и `-P` -- делают файлы видимыми для всех,
* `--delete-removed` -- позволяет на сервере удалить те файлы, что были удалены на компьютере,
* `--no-preserve` -- удаляют заголовки доступа файла в локальной системе,
* `--exclude` -- исключение из передачи файлов определенного типа,
* `--include` -- включение в передачу файлов определенного типа,
* `--add-header` -- ключ, позволяющий задать заголовки управляющие кешированием и другими директивами.

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

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

