PHP可以读取第三方URL,而Javascript无法读取。为什么?

时间:2018-07-25 23:46:34

标签: javascript php xmlhttprequest

在将第3方网页检索从PHP(使用cURL)迁移到Javascript时遇到一个奇怪的问题。

使用PHP可以毫无问题地检索页面,但是使用Javascript时,我会不断遇到以下错误:

  

请求的请求上没有'Access-Control-Allow-Origin'标头   资源。因此,不允许访问原点。

我已经搜索了相当多的内容,所有我能找到的答案就是解释,必须在服务器端设置Access-Control-Allow-Origin标头,如果不是,则基本上没有办法检索页面。

但是在这种情况下,我知道服务器愿意放弃战利品,因为PHP函数成功检索了页面。只有当我在Javascript函数中请求它时,它才会引发该错误。

这是(有效的)PHP函数:

$curl = curl_init();
curl_setopt_array($curl, array(
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_URL => <3rd party URL>,
));
$resp = curl_exec($curl);
curl_close($curl);

...这是(无效的)Javascript函数:

var getHTML = function ( url, callback ) {

    // Feature detection
    if ( !window.XMLHttpRequest ) return;

    // Create new request
    var xhr = new XMLHttpRequest();

    // Setup callback
    xhr.onload = function() {
        if ( callback && typeof( callback ) === 'function' ) {
            callback( this.responseXML );
        }
    }

    // Get the HTML
    xhr.open( 'GET', url );
    xhr.responseType = 'document';
    xhr.send();

};

getHTML( <3rd party URL>, function (resp) {
    console.log(resp);
});

1 个答案:

答案 0 :(得分:1)

浏览器具有内置的安全机制,除非在服务器上设置了特定的标头,否则不允许您进行跨站点请求。不是服务器不愿意返回数据,而是要保护您的个人信息的浏览器。您可以在this post.

中找到更多信息。