【问题标题】:Same Origin Policy, Javascript/jQuery AJAX and retrieving an RSS XML feed同源策略、Javascript/jQuery AJAX 和检索 RSS XML 提要
【发布时间】:2011-06-08 20:39:03
【问题描述】:

我在使用 jQuery 检索位于外部域的 RSS 提要时遇到了问题。它在 Safari 中工作,但其他浏览器会因为同源策略限制而出错(这也记录在 $.ajax() 函数中)。

想知道我是怎么解决的吗?

【问题讨论】:

  • 嗯,我认为通常的解决方案是提供一个代理脚本,该脚本与您的页面位于同一域中。那个,或者 JSONP。

标签: javascript jquery xml ajax same-origin-policy


【解决方案1】:

有三种方法可以绕过同源策略:

  1. 代理 -- 就像 Strawberry Sheurbert 所做的那样,非常有效,但浪费了带宽和计算能力
  2. JSONP -- 通过script 标签加载数据。需要来自源网站的合作,基本上是老套和笨拙。
  3. CORS——“正确”的方式,优雅而细致,但需要大量来自源网站的合作,并且不适用于旧版浏览器。

你付了钱,你就抓住了机会。

【讨论】:

    【解决方案2】:

    我制作了一个简单的 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']) );
    
    
    ?>

    它看起来很垃圾,但目前效果很好。希望对你有帮助。

    【讨论】:

    • 另外,你为什么要回答自己的问题?
    • 获得双倍积分:作为提问者和回答者:)
    • 我遇到了问题,然后找到了解决方案。我并不是说它是世界上所有可能的解决方案中最好的,但它适用于我的应用程序(大多数解决方案依赖于另一个站点的合作或用于另一个应用程序,即加载 JSON 数据)。也许有人发现它作为一种解决方案或替代解决方案的跳板很有用。
    猜你喜欢
    • 2012-08-22
    • 2011-07-28
    • 2016-01-17
    • 2014-07-23
    • 2010-09-25
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多