Одинаковая политика происхождения, Javascript / jQuery AJAX и получение RSS-канала RSS

-3

Я столкнулся с проблемой, использующей jQuery для извлечения RSS-канала, находящегося во внешнем домене. Он работал в Safari, но другие браузеры ошибались из-за ограничений в отношении одинаковой исходной политики (которые также описаны в функции $.ajax()).

Хотите знать, как я его исправил?

  • 0
    Ну, я думаю, что обычное решение - предоставить прокси-скрипт, который находится в том же домене, что и ваша страница. Это или JSONP.
  • 2
    нет, я не хочу знать
Теги:
same-origin-policy

2 ответа

3
Лучший ответ

Существует три способа обойти политику одинакового происхождения:

  • Прокси - как это сделал клубника Шерберт, совершенно эффективная, но трата пропускной способности и вычислительной мощности
  • JSONP - загрузка данных через тег script. Требуется сотрудничество с исходного сайта и в основном хакерское и неуклюжие.
  • CORS - "правильный" способ, элегантный и нюансный, но требует большого сотрудничества с исходного сайта и не работает с более старых браузеров.

Вы платите свои деньги, и у вас есть шанс.

-2

Я сделал простой PHP script следующим образом:

<?php

/*
    fetch.php fixes this issue: http://en.wikipedia.org/wiki/Same_origin_policy

    Read more:
        *   http://api.jquery.com/jQuery.ajax/
        *   http://stackoverflow.com/questions/3595515/xmlhttprequest-error-origin-null-is-not-allowed-by-access-control-allow-origin
        *   http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains
*/

// Requires URL
if ( !isset($_REQUEST['url']) || empty($_REQUEST['url']) ) exit( 'No url specified' );

// Set content-type
$type = 'application/rss+xml; charset=utf-8;';
if ( isset($_REQUEST['type']) && !empty($_REQUEST['type']) ) {
    $type = urldecode($_REQUEST['type']);
}

// Adapted from http://www.howtogeek.com/howto/programming/php-get-the-contents-of-a-web-page-rss-feed-or-xml-file-into-a-string-variable/
function get_url_contents( $url ){
    if ( function_exists('curl_init') ) {
        $crl = curl_init();
        $timeout = 5;
        curl_setopt ($crl, CURLOPT_URL, $url);
        curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
        $ret = curl_exec($crl);
        curl_close($crl);
        return $ret;
    } else {
        return file_get_contents( $url );
    }
    return 'Could not retrieve url';
}

// Output content from url
header( 'Content-type: ' . $type );
echo get_url_contents( urldecode($_REQUEST['url']) );


?>

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

  • 2
    Кроме того, почему вы отвечаете на свой вопрос?
  • 0
    Чтобы получить двойные баллы: как создатель вопроса и плакат с ответом :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню