CORS - No' Access-Control-Allow-Origin'标题存在

时间:2017-10-09 13:45:36

标签: javascript ajax .htaccess cors

我托管的网站上有许多不同的域名。

我们可以调用托管网站example.com和网址转发的域​​名 - example-x.com,example-y.com,example-z.com

访问经过网址转发的域​​时,会将跨域请求返回到主机站点example.com。

我目前正在向json文件发出ajax GET请求并收到以下错误;

  

否'访问控制 - 允许 - 来源'标题出现在请求的上   资源。起源' http://example-x.com'因此是不允许的   访问。

即使预检OPTIONS返回状态200并且GET方法返回状态200.

选项;

enter image description here

获取 enter image description here

我在主机htaccess上设置了以下CORs标头;

# <IfModule mod_headers.c>
   SetEnvIfNoCase Origin "https?://(www\.)?(example-x\.com|example-y\.com|example-z\.com)(:\d+)?$" ACAO=$0
   Header set Access-Control-Allow-Origin %{ACAO}e env=ACAO
   Header set Access-Control-Allow-Methods "GET, PUT, POST, DELETE, OPTIONS"
  Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range"
Header set Access-Control-Allow-Credentials true
# </IfModule>

我使用以下ajax请求调用GET;

var createCORSRequest = function(method, url) {
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr) { 
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest !== "undefined") { 
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else { 
        xhr = null;
    }
    return xhr;
}; 

var url = 'http://example.com/data.json'; 
var xhr = createCORSRequest('GET', url);
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xhr.setRequestHeader('Accept', 'application/json, text/javascript');  
xhr.onload = function() { console.log('success');}; 
xhr.onerror = function() { console.log('error'); }; 
xhr.send();

编辑

从ajax请求中删除setRequestHeader("Content-Type", "application/json; charset=UTF-8")已删除了预检要求,但CORs错误仍然存​​在,下面的屏幕截图显示了GET的请求/响应,我的猜测是没有设置正确的htaccess标头RequestURL - http://example.com/cms/wp-content/uploads/2017/04/preloader_data.json

获取 - 没有选项预检 enter image description here

2 个答案:

答案 0 :(得分:1)

您正尝试通过results <- test.df %>% mutate(a = test.vec[[paste0(sentence, '_a')]]) 请求检索json。这应该是simple request,并且不需要预检请求。

如果您查看来自MDN的预检请求的要求,您可以看到GETContent-Typeapplication/x-www-form-urlencoded以外的设置multipart/form-data将导致此预检​​请求

如果您从the RFC查看text/plain“包含有效负载正文的消息” “应该”。但是您的获取请求没有有效负载。因此,从ajax调用中删除该标头。

答案 1 :(得分:-3)

在客户的请求中,您没有设置正确的标头:

xhr.setRequestHeader('Accept', 'application/json, text/javascript'); 
xhr.setRequestHeader('Access-Control-Allow-Headers', '*');

否&#39;访问控制 - 允许 - 来源&#39;标头出现在请求的资源上。起源&#39; http://example-x.com&#39;因此不允许访问。 - &GT; xhr.setRequestHeader(&#39; Access-Control-Allow-Headers&#39;,&#39; *&#39;);

我认为我们不能比本教程更好地回答: https://www.html5rocks.com/en/tutorials/cors/

本网站提供有关如何设置服务器以允许CORS的信息: https://enable-cors.org/server.html