我的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”
答案 0 :(得分:0)
如果由于愚蠢的“ mixed content”限制而导致协议不匹配(至少在Firefox和Chromium中),则无法通过AJAX,JSONP或iFrame获取外部资源。我的网站运行在http之上,并且已为其编写用户脚本的网站已实施https(这意味着尝试通过http请求其页面会自动重定向到https,因此我什至无法选择加入http来解决此限制)
答案 1 :(得分:-1)
只要您愿意,Access-Control-Allow-Origin标头应与Origin标头具有相同的值。
所以。您想要多个域。我建议您使用“正则表达式”