2011-01-13 3 views
-3

Ich stieß auf ein Problem mit jQuery, um einen RSS-Feed in einer externen Domäne abzurufen. Es funktionierte in Safari, aber andere Browser würden Fehler wegen der gleichen Ursprungsrichtlinien-Einschränkungen (die auch über die $ .ajax() - Funktion dokumentiert sind).Gleiche Ursprungsrichtlinie, Javascript/jQuery AJAX und Abruf eines RSS-XML-Feeds

Möchten Sie wissen, wie ich es behoben habe?

+0

Uh, nun, ich denke, die übliche Lösung besteht darin, ein Proxy-Skript zur Verfügung zu stellen, das sich auf derselben Domain wie Ihre Seite befindet. Das oder JSONP. – tdammers

+2

nein ich will nicht wissen – mkoryak

Antwort

3

Es gibt drei Möglichkeiten, um die Same Origin Policy zu erhalten:

  1. Proxy - wie Strawberry Sheurbert tat, vollkommen wirksam, aber eine Verschwendung von Bandbreite und Rechenleistung
  2. JSONP - die Daten geladen werden durch den script Tag. Benötigt Zusammenarbeit von der Quellwebseite und grundsätzlich hackisch und ungeschickt.
  3. CORS - der "richtige" Weg, elegant und nuanciert, aber braucht viel der Zusammenarbeit von der Quelle Website und funktioniert nicht mit älteren Browsern.

Sie zahlen Ihr Geld und Sie nehmen Ihre Chance.

-2

machte ich einen einfachen PHP-Skript wie folgt:

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


?>

ziemlich Müll Es sieht, aber es funktioniert im Moment gut genug. Ich hoffe, es hilft.

+2

Auch, warum beantworten Sie Ihre eigene Frage? – tdammers

+0

Um doppelte Punkte zu bekommen: als Frage Maker und ein Antwort Poster :) – dzendras

+0

zweimal die negativen Punkte klingt nicht wie ein gutes Geschäft – mkoryak