提问者:小点点

同一函数在一个页面中抛出“no'access-control-allow-origin'”,而在其他页面中则不抛出


我有一个函数可以在我的Django网站上获取邮政编码信息。 问题是,除了一个页面之外,这个功能在所有页面中都能完美工作。 我对所有的页面都使用了相同的页眉。

var HttpClient = function () {
    this.get = function (aUrl, aCallback) {
        var anHttpRequest = new XMLHttpRequest();
        anHttpRequest.onreadystatechange = function () {
            if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200)
                aCallback(anHttpRequest.responseText);
        }
    anHttpRequest.open("GET", aUrl, true);
    anHttpRequest.send(null);
    }
}


function getZipCode(obj) {
    var client = new HttpClient();
    client.get("http://viacep.com.br/ws/" + obj.value + "/json/", function (response) {
        console.log(response_json)
        //more code...
    })
}

在有问题的页面中,我得到了著名的“请求的资源上没有'Access-Control-Allow-Origin'头”。 错误。 我对此研究了很多,但当这个问题只出现在一页纸上时,却找不到一个正确的解决方法。 我怎样才能使这个工作在所有的页面?


共1个答案

匿名用户

从根本上说:如果您在A页上没有得到错误,而在B页上得到了错误,那么:

>

  • 页A和页B的来源不同。 它们的方案不同(例如httphttps),它们的主机名不同(记住example.comwww.example.com是不同的主机名,导致不同的来源),或者它们的端口不同。

    位于viacep.com.br的目标系统根据自己的规则主动决定是否允许跨源调用,并选择不允许来自页面B的URL的调用(不发回必要的头),即使它允许来自同一源上的其他页面的调用。 这是一个系统可以做到的,但实际上很少做到。

    那么,假设第一,同一站点中的B页有什么不同呢? 它可能是:

    > 如果有问题的页面在http上,而所有其他页面在https上,或者反之亦然,并且源允许来自其中一个而不是另一个的跨源调用,则

  • 如果您的页面位于viacep.com.br上,而唯一有问题的页面位于https上。 您正在进行的调用是对http://viacep.com.br的调用,因此http://viacep.com.br上的其他页面是相同来源的(但https://viacep.com.br上的页面是交叉来源的)。

    (正如charlietfl指出的)出现问题的页面使用了不同的主机名,可能是子域或类似的名称。