Ответ 1
Это по дизайну. Вы не можете сделать произвольный HTTP-запрос другому серверу с использованием XMLHttpRequest, если только этот сервер не разрешит его, поставив заголовок Access-Control-Allow-Origin для запрашивающего узла.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Вы можете получить его в теге script (для скриптов и изображений и таблиц стилей не существует одинакового ограничения), но если только не возвращенный контент не является script, он не принесет вам много пользы.
Вот учебник по CORS:
Все это сделано для защиты конечного пользователя. Предполагая, что изображение на самом деле является изображением, таблица стилей - это только таблица стилей, а 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) вы должны сотрудничать с сервером, на который вы делаете запросы, и в (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 на целевой сервер?
- Ваш белый список достаточно защищает вас от произвольных запросов?
- Какие заголовки (например, время изменения и т.д.) вы будете передавать обратно в браузер, когда ваш сервер их получил и какие из них вы опустите или измените?
- Будет ли ваш сервер замешан как незаконный запрос (поскольку вы выступаете в качестве прокси-сервера)?
Я уверен, что есть и другие. Но если ни одна из этих проблем не предотвратит это, этот третий метод может работать достаточно хорошо.