Загрузка сети Unity3D WebGL с S3 не удалась из-за отсутствия заголовка Origin + CORS

У меня возникли проблемы с загрузкой ресурса из нашей сети CDN S3.

Кажется, мы правильно настроили CORS на S3.

руководство по устранению неполадок указывает, что вам нужно опубликовать заголовок «Origin», иначе он будет игнорировать все заголовки CORS:

Если заголовок отсутствует, Amazon S3 не обрабатывает запрос как запрос из другого источника и не отправляет в ответ заголовки ответа CORS.

Я протестировал использование curl, чтобы убедиться, что соответствующие заголовки CORS возвращаются, и я вижу, что они возвращаются только в том случае, если отправляется заголовок «Origin».

например: если я запускаю следующее:

curl -v -H "Origin: http://localhost" https://cdn.myurl.com/mybucket/mystuff.json

Я получаю следующие заголовки (а также другую информацию):

access-control-allow-origin: *
access-control-allow-methods: GET, POST, HEAD

Однако, когда я НЕ передаю заголовок Origin, эти заголовки возврата отсутствуют:

curl -v https://cdn.myurl.com/mybucket/mystuff.json

Я пытаюсь получить данные, используя запрос на получение UnityWebRequest. Когда я запускаю свое приложение через WebGL, я вижу исключение при вызове request.SendWebRequest().

Не удалось загрузить https://cdn.myurl.com/mybucket/mystuff.json. : в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:17936' запрещен.

Я могу только предположить, что UnityWebRequest не отправляет заголовок «Origin».

Я не могу явно установить заголовок, потому что если я это сделаю, я получу ошибку:

UnityWebRequest request = UnityWebRequest.Get(uri);
request.SetRequestHeader("Origin", "http://localhost");

InvalidOperationException: невозможно переопределить заголовки, указанные системой.

Я совсем застрял на этом этапе.


ОБНОВИТЬ:

@sideshowbarker упомянул, что заголовок Origin автоматически добавляется браузером, так что, возможно, это было отвлекающим маневром для меня.

Они также предложили мне посмотреть заголовки запросов в инструментах моего браузера. Вот что я вижу, когда смотрю на запрос от приложения WebGL для этого конкретного объекта в моем браузере:

Заголовки веб-запросов

Здесь есть пара моментов, которые меня интересуют.

  • В заголовках запроса есть примечание о том, что показаны предварительные заголовки. Я предполагаю, что это означает, что инструменты браузера делают все возможное, чтобы понять, какие заголовки отправляются?
  • Запрос выполнен успешно — я получаю код ответа 200 (успешно). Заголовок длины содержимого (42) имеет правильный размер, который я ожидаю. Код игры просто не работает из-за отсутствующих заголовков CORS.
  • На изображении показан код ответа 200 с примечанием «(из кеша диска)». Я очистил свой кеш и повторно запустил это, и первое попадание (мой код выполняет повторную попытку) правильно не загружается из кеша, но все равно не проходит тест CORS.

Единственный другой гаечный ключ в этой смеси, о котором я могу думать, это то, что мы используем CloudFlare перед корзиной S3. Я считаю, что это не должно вызывать проблем, поскольку предполагается пересылка заголовков CORS, но я проведу тест в обход CloudFlare.


person Buzzrick    schedule 23.08.2018    source источник
comment
Заголовок Origin добавляется браузерами, а не каким-либо кодом веб-приложения. Так что причина указанной в вопросе ошибки не в отсутствии заголовка Origin в запросе. Проверьте заголовки запроса для запроса в панели «Сеть» вашего браузера devtools.   -  person sideshowbarker    schedule 23.08.2018


Ответы (2)


Вы должны добавить политику CORS в корзину S3, где вы размещаете свою игру. Документация AWS. Это позволит вам совершать вызовы https и вызовы Rest API и т. д. Это настройка ведра, а не игра.

person Dan Flanagan    schedule 23.08.2018
comment
Я уже настроил свою политику CORS в своей корзине S3 и подтвердил, что правильные заголовки возвращаются, когда я вызываю curl при публикации исходного заголовка. - person Buzzrick; 24.08.2018
comment
Вы размещаете свою игру в корзине или запускаете ее локально? Если вы запускаете его локально, как показано выше, с учетом localhost://, вам нужно запустить его в веб-браузере без защиты CORS. Поскольку на локальном узле CORS не включен chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security - person Dan Flanagan; 24.08.2018

Просто добавьте запрос HEAD в конфигурацию cors Amazon.

[
{
    "AllowedHeaders": [
        "*"
    ],
    "AllowedMethods": [
        "GET",
        "POST",
        "HEAD"
    ],
person Axx Silvera    schedule 03.11.2020