У меня возникли проблемы с загрузкой ресурса из нашей сети 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.