Что такое CORS: правило браузера, стоящее за каждой ошибкой cross-origin
Простые запросы, preflight и учётные данные, с тестами на curl.
Читать руководствоСправка CDN.com.tr
Добавляйте Access-Control-Allow-Origin и другие заголовки CORS к ответам правила доставки, оставьте ответы на preflight-запросы OPTIONS вашему origin и разрешите в WAF методы, которые использует ваш API.
Кеш, безопасность, WAF и очистка
Добавляйте Access-Control-Allow-Origin и другие заголовки CORS к ответам правила доставки, оставьте ответы на preflight-запросы OPTIONS вашему origin и разрешите в WAF методы, которые использует ваш API.
https://app.example.com, или * для файлов, которые может загружать кто угодно.OPTIONS на этих путях кодом 200 или 204.То, что отправляет браузер, определяет, где выполняется работа.
GET: preflight нет, и Access-Control-Allow-Origin в правиле — всё, что им нужно. Пока включена оптимизация изображений для всего аккаунта, файлы .jpg, .jpeg и .png берут заголовки ответа самого старого правила домена, а не правила своего пути.PUT, PATCH, DELETE: браузер сначала отправляет preflight; на него отвечает ваш origin, а правило может добавить к этому ответу заголовки CORS.*, плюс Access-Control-Allow-Credentials true.Выберите один источник для каждого заголовка.
always, то и в ответах 4xx и 5xx вашего origin.Vary: Origin.Пример для API в /api/, который вызывает одно веб-приложение. Пишите по одному заголовку в строке; значение с пробелами заключается в двойные кавычки.
/api/.Access-Control-Allow-Origin https://app.example.com, Access-Control-Allow-Methods "GET, POST, PUT, OPTIONS", Access-Control-Allow-Headers "Content-Type, Authorization" и Access-Control-Max-Age 600.Ожидаемый результат: У правила появляется метка вроде +4 загол. ответа, а на странице появляется Опубликовано, как только edge начинает его применять.
Нужно, пока включён WAF для всего сайта и API использует методы помимо GET, HEAD, POST и OPTIONS.
PUT, PATCH или DELETE, как нужно вашему API, оставьте OPTIONS отмеченным и нажмите Save.Ожидаемый результат: Панель подтверждает сохранение, а изменение распространяется в течение 1-2 минут.
curl не применяет правила CORS, поэтому показывает ровно то, что отвечает edge.
Origin.OPTIONS с Origin, Access-Control-Request-Method и Access-Control-Request-Headers.Ожидаемый результат: Простой запрос содержит один access-control-allow-origin. Preflight отвечает 200 или 204 с разрешёнными origin, методами и заголовками.
curl -s -o /dev/null -D - -H 'Origin: https://app.example.com' https://www.example.com/api/items | grep -iE '^(HTTP|access-control)'
curl -s -o /dev/null -D - -X OPTIONS -H 'Origin: https://app.example.com' -H 'Access-Control-Request-Method: PUT' -H 'Access-Control-Request-Headers: content-type' https://www.example.com/api/items | grep -iE '^(HTTP|access-control|x-mt-blocked-by)'
Веб-приложение на app.example.com загружает шрифты, JSON или ответы API с www.example.com, и браузер блокирует их с ошибкой CORS.
Имя-Заголовка значение, без двоеточия, например Access-Control-Allow-Origin https://app.example.com. Значение с пробелами заключается в двойные кавычки.Access-Control-* для этих путей, отметьте то же имя в разделе Удалить заголовки, чтобы браузер получил одно значение.PUT, PATCH или DELETE и включён WAF для всего сайта, отметьте эти методы в разделе Разрешённые методы HTTP на странице Security.always, добавляется и к ответам 4xx и 5xx вашего origin.OPTIONS уходят на ваш origin и никогда не кэшируются. Когда ваш origin отвечает на preflight кодом 200 или 204, к этому ответу добавляются заголовки правила; preflight, на который пришёл ответ 401, 404 или 405, доходит до браузера без них, если строка не заканчивается на always. В правиле, где включена Защита паролем или задан Список разрешённых IP, edge сам отвечает 401 или 403 на preflight, который не пропускает.Access-Control-Allow-Origin: при двух значениях браузер отклоняет ответ.Access-Control-Allow-Origin в зависимости от запрашивающего сайта, он должен также отправлять Vary: Origin. Edge хранит эти варианты раздельно, пока в правиле выключен параметр Хранить одну копию в кэше независимо от заголовка Vary.Access-Control-Request-Method и Access-Control-Request-Headers неотмеченными в разделе Удалить заголовки: отмеченные там имена удаляются и из запросов, отправляемых на ваш origin, а ваш origin читает эти два заголовка, чтобы ответить на preflight.GET, HEAD, POST и OPTIONS разрешены по умолчанию. Запрос с методом, которого нет в списке, получает 403 без заголовков CORS и с X-MT-Blocked-By: cdn-edge-security, а браузер сообщает об этом как об ошибке CORS..jpg, .jpeg и .png получают заголовки ответа самого старого правила домена, а не правила своего пути: добавьте заголовок CORS для этих изображений в то правило, с фиксированным Access-Control-Allow-Origin. Если это самое старое правило — правило проверки сертификатов, они не получают заголовков ни от одного правила.Edge передаёт запросы OPTIONS на ваш origin и никогда их не кэширует, поэтому ваш origin должен отвечать на preflight кодом 200 или 204. К этому ответу добавляются заголовки ответа правила: заголовки CORS могут приходить из правила, а вашему origin достаточно принимать OPTIONS. Исключение: в правиле, где включена Защита паролем или задан Список разрешённых IP, edge сам отвечает 401 или 403 на preflight, который не пропускает.
Правило добавляет одно и то же значение ко всем ответам: * или один origin, например https://app.example.com. Чтобы разрешить несколько origin, пусть ваше приложение отправляет подходящий origin вместе с Vary: Origin, а Access-Control-Allow-Origin в правило не добавляйте. Запросам с cookie или другими учётными данными нужен конкретный origin, а не *.
Начните со статуса неудачного запроса на панели «Сеть» в браузере. 403 с X-MT-Blocked-By: cdn-edge-security приходит от edge: найдите его в журналах WAF и, если его метода нет в списке, добавьте метод в разделе Разрешённые методы HTTP. По умолчанию любой другой 4xx или 5xx приходит без заголовков правила, поэтому сначала исправьте этот ответ. Строка, которая заканчивается на always, например Access-Control-Allow-Origin https://app.example.com always, добавляется и к ответам 4xx и 5xx вашего origin. Затем проверьте, что приходит ровно один Access-Control-Allow-Origin и что он совпадает с запрашивающим сайтом, включая схему.
Пока включён WAF для всего сайта, откройте страницу Security, отметьте методы в разделе Разрешённые методы HTTP и нажмите Save; изменение распространяется в течение 1-2 минут. Разрешённые методы запросов на вкладке Безопасность в правилах доставки открывает ту же карточку. Оставьте OPTIONS отмеченным: браузеры отправляют его для preflight-запросов.