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

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

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

Ответы [ 2 ]

3 голосов
/ 14 января 2011

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

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

Вы платите деньги и рискуете.

0 голосов
/ 14 января 2011

Я сделал простой PHP-скрипт примерно так:

<?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']) );


?>

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

...