Поделиться через


Использование Azure CDN с CORS

Внимание

Azure CDN standard от Корпорации Майкрософт (классическая версия) будет прекращена 30 сентября 2027 г. Чтобы избежать нарушений работы службы, важно перенести профили Azure CDN уровня "Стандартный" от Майкрософт (классический) на уровень Azure Front Door standard или Premium к 30 сентября 2027 года. Дополнительные сведения см. в статье Azure CDN Standard от майкрософт (классическая версия).

Azure CDN из Эдгио будет прекращено 4 ноября 2025 г. Перед этой датой необходимо перенести рабочую нагрузку в Azure Front Door. Дополнительные сведения см. в статье Azure CDN из Edgio для выхода на пенсию.

Что такое CORS?

CORS (совместное использование ресурсов между источниками) — это функция HTTP, которая позволяет веб-приложению, работающему под одним доменом, получать доступ к ресурсам в другом домене. Чтобы снизить вероятность атак с использованием межузловых сценариев, все современные веб-браузеры реализуют ограничение безопасности, известное как политика одного источника. Это ограничение запрещает веб-странице вызывать API в другом домене. CORS позволяет одному источнику (исходному домену) безопасно вызывать интерфейсы API в другом источнике.

Принцип работы

Существует два типа запросов CORS, простые запросы и сложные запросы.

Простые запросы

  1. Браузер отправляет запрос CORS с дополнительным заголовком HTTP-запроса источника . Значение заголовка запроса — источник, обслуживающий родительскую страницу, которая определяется как сочетание протокола, домена и порта. Когда страница из HTTPS://www.contoso.com попытки получить доступ к данным пользователя в источнике fabrikam.com, следующий заголовок запроса будет отправлен в fabrikam.com:

    Origin: https://www.contoso.com

  2. Сервер может ответить любым из следующих заголовков:

    • Ответ с заголовком Access-Control-Allow-Origin, который указывает, какие исходные сайты разрешены. Например:

      Access-Control-Allow-Origin: https://www.contoso.com

    • Код ошибки HTTP (например, 403), если сервер запрещает запрос, независимо от источника после проверки заголовка Origin.

    • Заголовок Access-Control-Allow-Origin с подстановочным знаком, который разрешает все источники:

      Access-Control-Allow-Origin: *

Сложные запросы

Сложный запрос — это запрос CORS, для выполнения которого браузер должен отправить предварительный запрос (т. е. выполнить предварительную проверку) перед отправкой самого запроса CORS. Предварительный запрос запрашивает у сервера разрешения на выполнение исходного запроса CORS. Он представляет собой запрос OPTIONS к тому же URL-адресу.

Совет

Дополнительные сведения о процедурах CORS и типичных проблемах доступны в руководстве по CORS для REST API.

Подстановочный знак или сценарии с одним источником

CORS в Azure CDN работает автоматически без дополнительных конфигураций, если заголовок Access-Control-Allow-Origin имеет подстановочный знак (*) или один источник. CDN кэширует первый ответ и последующие запросы используют тот же заголовок.

Если запросы уже были сделаны в CDN до установки CORS в источнике, необходимо очистить содержимое конечной точки, чтобы перезагрузить содержимое с заголовком Access-Control-Allow-Origin .

Сценарии с несколькими источниками

Если необходимо разрешить для CORS определенный набор источников, задача несколько усложняется. Проблема возникает, когда CDN кэширует заголовок Access-Control-Allow-Origin для первого источника CORS. Если другой источник CORS выполняет последующий запрос, CDN обслуживает кэшированный заголовок Access-Control-Allow-Origin , который не соответствует. Исправить эту проблему можно несколькими способами.

Профили Azure CDN уровня "Стандартный"

В Azure CDN уровня "Стандартный" от Майкрософт можно создать правило в стандартном обработчике правил, чтобы проверить заголовок Origin в запросе. Если это допустимый источник, правило задает заголовок Access-Control-Allow-Origin с нужным значением. В обоих случаях заголовок Access-Control-Allow-Origin из файла сервера-источника игнорируется, и разрешенными источниками CORS управляет только обработчик правил CDN.

Пример правил со стандартным обработчиком правил

Совет

К правилу можно добавить дополнительные действия для изменения других заголовков ответа, таких как Access-Control-Allow-Methods.

Azure CDN Premium из Эдгио

С помощью обработчика правил Edgio Premium необходимо создать правило , чтобы проверить заголовок Origin в запросе. Если это допустимый источник, правило задает заголовок Access-Control-Allow-Origin с источником, указанным в запросе. Если источник, указанный в заголовке Origin , не разрешен, правило должно опустить заголовок Access-Control-Allow-Origin , что приводит к отклонению запроса браузером.

Существует два способа устранить эту проблему с подсистемой правил Premium. В обоих случаях заголовок Access-Control-Allow-Origin из файла сервера-источника игнорируется, и разрешенными источниками CORS управляет только обработчик правил CDN.

Одно регулярное выражение со всеми допустимыми источниками

В этом случае создается регулярное выражение, включающее все источники, которые необходимо разрешить:

https?:\/\/(www\.contoso\.com|contoso\.com|www\.microsoft\.com|microsoft.com\.com)$

Совет

Azure CDN Premium из Edgio использует совместимые с Perl Регулярные выражения в качестве механизма для регулярных выражений. Для проверки регулярного выражения можно использовать такие ресурсы, как Regular Expressions 101. Обратите внимание, что символ "/" в регулярных выражениях является допустимым и экранировать его необязательно. Однако его все же рекомендуется экранировать, и некоторые средства проверки регулярных выражений ожидают, что он будет экранирован.

Если регулярное выражение совпадает , правило заменяет заголовок Access-Control-Allow-Origin (если таковой) из источника источником, отправляющим запрос. Вы также можете добавить дополнительные заголовки CORS, такие как методы access-Control-Allow-Methods.

Пример правил с регулярным выражением

Правило заголовка запроса для каждого источника.

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

Пример правил без регулярного выражения

Совет

В примере использование подстановочного знака * указывает обработчику правил соответствие как HTTP, так и HTTPS.