用户脚本跨域请求失败

时间:2018-06-23 06:46:52

标签: javascript php cors cross-domain

我的AJAX功能:

class Group {
    public string GroupName ; 
    public List<Access> Details ; 
}

Class Access {
     public int Id;
     public string Name; 
}

函数调用:

Class GroupDto
{
    string GroupName; 
    List<int> Details ; 
}

在PHP中设置的标头:

function ajaxQuery(url, method, param, async, onsuccess, onfailure) {
    var xmlHttpRequest = new XMLHttpRequest();
    var callback = function(r) { r.status==200 ? (typeof(onsuccess)=='function' && onsuccess(r)) : (typeof(onfailure)=='function' && onfailure(r)); };

    if(async) { xmlHttpRequest.onreadystatechange = function() { if(xmlHttpRequest.readyState==4) { callback(xmlHttpRequest); } } }
    xmlHttpRequest.open(method, url, async);
    xmlHttpRequest.setRequestHeader('X-REQUESTED-WITH', 'XMLHttpRequest');
    xmlHttpRequest.withCredentials = true;
    if(method == 'POST') { xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); }
    xmlHttpRequest.send(param);
    if(!async) { callback(xmlHttpRequest); }
}

我正在从使用https的页面调用用户脚本,而我的域使用http。当我通过http尝试AJAX时,我得到(Firefox)ajaxQuery('http://example.net/index.php', 'GET', null, true, function(r) { tmp.innerHTML = r.responseText; nlt = [].map.call(tmp.querySelectorAll('.nlt'), function(x) { return x.textContent; }); }); 。如果我将查询URL切换为https,即使我的PHP脚本明确允许来自外部站点的请求,错误也会变为header('Access-Control-Allow-Origin: https://example.com'); header('Access-Control-Allow-Origin: https://www.example.com'); header('Access-Control-Allow-Origin: http://example.net'); header('Access-Control-Allow-Methods: GET, OPTIONS'); header('Access-Control-Allow-Credentials: true'); if(!preg_match('%https?:\/\/(www\.)?example\.com%', $_SERVER['HTTP_REFERER']) && !preg_match('%https?:\/\/example\.net%', $_SERVER['HTTP_REFERER'])) { die('No way!'); } 。我想念什么?

在此特定示例中,我的网站是“ http://example.net”,外部网站是“ https://www.example.com

2 个答案:

答案 0 :(得分:0)

如果由于愚蠢的“ mixed content”限制而导致协议不匹配(至少在Firefox和Chromium中),则无法通过AJAX,JSONP或iFrame获取外部资源。我的网站运行在http之上,并且已为其编写用户脚本的网站已实施https(这意味着尝试通过http请求其页面会自动重定向到https,因此我什至无法选择加入http来解决此限制)

答案 1 :(得分:-1)

只要您愿意,Access-Control-Allow-Origin标头应与Origin标头具有相同的值。

所以。您想要多个域。我建议您使用“正则表达式”