AJAX-запрос получает сообщение об ошибке "Отсутствует заголовок Access-Control-Allow-Origin" в запрашиваемом ресурсе "

Я пытаюсь отправить запрос GET в запросе jQuery AJAX.

$.ajax({
    type: 'GET',
    url: /* <the link as string> */,
    dataType: 'text/html',
    success: function() { alert("Success"); },
    error: function() { alert("Error"); },
});

Однако, что бы я ни пытался, я получил XMLHttpRequest cannot load <page>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:7776' is therefore not allowed access.

Я перепробовал все, от добавления определений header : {} к запросу AJAX до установки dataType на JSONP или даже text/plain, используя простой AJAX вместо jQuery, даже загружая плагин, который включает CORS - но ничто не могло помочь.

И то же самое происходит, если я пытаюсь попасть на другие сайты.

Есть идеи для правильного и простого решения? Есть ли вообще?

Ответ 1

Это по дизайну. Вы не можете сделать произвольный HTTP-запрос другому серверу с использованием XMLHttpRequest, если только этот сервер не разрешит его, поставив заголовок Access-Control-Allow-Origin для запрашивающего узла.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Вы можете получить его в теге script (для скриптов и изображений и таблиц стилей не существует одинакового ограничения), но если только не возвращенный контент не является script, он не принесет вам много пользы.

Вот учебник по CORS:

http://www.bennadel.com/blog/2327-cross-origin-resource-sharing-cors-ajax-requests-between-jquery-and-node-js.htm

Все это сделано для защиты конечного пользователя. Предполагая, что изображение на самом деле является изображением, таблица стилей - это только таблица стилей, а script - это просто script, запрашивающая эти ресурсы с другого сервера не может навредить.

Но, в общем, запросы с кросс-началом могут делать очень плохие вещи. Скажите, что вы, Золтан, используете coolsharks.com. Скажите также, что вы вошли в mybank.com, и в вашем браузере есть файл cookie для mybank.com. Теперь предположим, что coolsharks.com отправляет запрос AJAX на mybank.com, прося перевести все ваши деньги на другой аккаунт. Поскольку у вас есть файл cookie mybank.com, они успешно завершают запрос. И все это происходит без вашего ведома, потому что перезагрузки страницы не произошло. Это опасность разрешить общие запросы AJAX на межсайтовых сайтах.

Если вы хотите выполнять межсайтовые запросы, у вас есть два варианта:

  • Получить сервер, на который вы делаете запрос, либо в а. Допустим, вы выпустили заголовок Access-Control-Allow-Origin, который включает вас (или *)
    б. Предоставьте вам API JSONP.

или

  1. Напишите свой собственный браузер, который не соответствует стандартам и не имеет ограничений.

В (1) вы должны сотрудничать с сервером, на который вы делаете запросы, и в (2) вы должны иметь контроль над браузером конечного пользователя. Если вы не можете выполнить (1) или (2), вам очень не повезло.

Однако есть третий вариант (указывается charlietfl). Вы можете сделать запрос с сервера, который вы контролируете, а затем передать результат на свою страницу. Например.

<script>
$.ajax({
    type: 'GET',
    url: '/proxyAjax.php?url=http%3A%2F%2Fstackoverflow.com%2F10m',
    dataType: 'text/html',
    success: function() { alert("Success"); },
    error: function() { alert("Error"); }
});
</script>

А затем на вашем сервере, в самом простом:

<?php
// proxyAjax.php
// ... validation of params
// and checking of url against whitelist would happen here ...
// assume that $url now contains "http://stackoverflow.com/10m"
echo file_get_contents($url);

Конечно, этот метод может столкнуться с другими проблемами:

  • Требуется ли на вашем сайте прокси-сервер для правильного реферера или определенного IP-адреса?
  • Нужно ли передавать файлы cookie на целевой сервер?
  • Ваш белый список достаточно защищает вас от произвольных запросов?
  • Какие заголовки (например, время изменения и т.д.) вы будете передавать обратно в браузер, когда ваш сервер их получил и какие из них вы опустите или измените?
  • Будет ли ваш сервер замешан как незаконный запрос (поскольку вы выступаете в качестве прокси-сервера)?

Я уверен, что есть и другие. Но если ни одна из этих проблем не предотвратит это, этот третий метод может работать достаточно хорошо.

Ответ 2

вы можете попросить разработчиков этого домена, если они установят для вас соответствующий заголовок, это ограничение предназначено только для javascript, в основном вы можете запросить ressource с вашего сервера с помощью php или любого другого, а javascript запрашивает данные из вашего домена затем