location ~ .(jpg|png|gif|jpeg|css|js)$ {
expires 2w;
if ($http_user_agent ~ ^CoralWebPrx) { break; }
if ($query_string ~ (^|&)coral-no-serve$) { break; }
add_header X-Coral-Control "redirect-home";
rewrite ^/(.*) $scheme://$host.nyud.net/$1? redirect;
}
Эта часть конфигурации Nginx позволяет всю статику перенаправить через чужие сервера.
Суть работы Coral в том, чтобы взять ресурс у нас и закешировать его у себя. Стало быть, простая идея все запросы на статику всегда перенаправлять на CoralCDN сразу же приведет к бесконечной переадресации между нашим сервером и CDN. Для того, чтобы избежать этого — ставим проверку на http_user_agent:
if ($http_user_agent ~ ^CoralWebPrx) { break; }
Далее. Сеть Coral не всегда отдаст нам желаемую копию. В некоторых случаях узел сети откажется нас обслуживать и перенаправит запрос обратно, добавив GET-параметр coral-no-serve. Значит — проверяем GET-параметры.
if ($query_string ~ (^|&)coral-no-serve$) { break; }
Зачем нужен дополнительный заголовок X-Coral-Control при перенаправлении запроса к CoralCDN? Дело в том, что если с наш хост создает слишком большую нагрузку на CDN – нас откажутся обслуживать, но по умолчанию нас уже не отправят обратно, а выдадут 403 FORBIDDEN заголовок. Здесь мы можем решить оставить это так, как есть. От нагрузки сервер упал, бывает. Но мы можем попытаться отдать свой ресурс сами. Для этого укажем Coral, что запрос надо вернуть обратно, на настоящий ресурс в случае, если нагрузка от нас слишком велика. Тогда все пойдет по вышеупомянутому пути с GET-параметром coral-no-serve.
Зачем указаван expires? Дело в том, что если не указывать никакого срока годности, то по-умолчанию Coral будет хранить его 12 часов.
Не все и не всегда может быть перенаправлено через Coral. Есть 3 причины, по которым узел CDN может отказать нам в обслуживании: