请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'...'访问

时间:2013-12-06 21:13:04

标签: javascript jquery ajax cors xmlhttprequest

我正在使用.htaccess来重写网址,我使用了html基本标记以使其正常工作。

现在,当我尝试发出ajax请求时,我收到以下错误:

  

XMLHttpRequest无法加载http://www.wordicious.com/login.php。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://wordicious.com”访问。

11 个答案:

答案 0 :(得分:170)

使用 addHeader 而不是使用 setHeader 方法,

response.addHeader("Access-Control-Allow-Origin", "*");
上面一行中的

* 将允许 access to all domains


允许 access to specific domain only

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

选中blog post

答案 1 :(得分:145)

为什么会出现错误:

JavaScript代码受same-origin policy的限制,这意味着,从www.example.com页面,您只能向位于完全相同域的服务发出(AJAX)请求在这种情况下,确切地www.example.com example.com - 没有www - 或whatever.example.com)。

在您的情况下,您的Ajax代码正尝试从位于http://wordicious.com的页面http://www.wordicious.com中访问服务。

虽然非常相似,但它们相同的域名。当它们不在同一个域中时,只有当目标的respose包含Access-Control-Allow-Origin标题时,该请求才会成功。

由于http://wordicious.com处的页面/服务从未配置为显示此标头,因此会显示该错误消息。

解决方案:

如上所述,原点(包含JavaScript的页面所在的位置)和目标(JavaScript试图访问的目标)域必须是完全相同。

你的案子似乎是一个错字。看起来http://wordicious.comhttp://www.wordicious.com实际上是相同的服务器/域。因此,要修复,请平均键入目标和原点:使您向http://www.wordicious.com而不是http://wordicious.com 的Ajax代码请求页面/服务。 (可能会将目标网址放在相对位置,例如'/login.php',而不是域名。)



更一般地说:

如果问题不是像这个问题那样的拼写错误,那么解决方案就是Access-Control-Allow-Origin添加到目标域。当然,添加它取决于该地址背后的服务器/语言。有时,工具中的配置变量可以解决问题。其他时候你必须自己通过代码添加标题。

答案 2 :(得分:61)

对于.NET服务器,可以在web.config中进行配置,如下所示

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

例如,假设服务器域为http://live.makemypublication.com且客户端为http://www.makemypublication.com,则在服务器的web.config中进行配置,如下所示

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>

答案 3 :(得分:9)

您需要在php页面的开头添加此内容&#34; login.php&#34;

<?php header('Access-Control-Allow-Origin: *'); ?>

答案 4 :(得分:7)

您必须将标题键/值放在选项方法响应中。 例如,如果您有资源http://mydomain.com/myresource 然后,在您编写的服务器代码中

//response handler
void handleRequest(Request request, Response response) {
    if(request.method == "OPTIONS") {
       response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
       response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }



}

答案 5 :(得分:3)

解决方法是使用在“源”主机上运行的反向代理并转发到目标服务器,例如Fiddler:

链接到这里: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

或Apache反向代理......

答案 6 :(得分:3)

基本上通过添加以下附加参数来更改API标头响应。

Access-Control-Allow-Credentials:true

Access-Control-Allow-Origin:*

但就安全而言,这不是一个好的解决方案

答案 7 :(得分:1)

将此文件添加到PHP文件或主控制器

header("Access-Control-Allow-Origin: http://localhost:9000");

答案 8 :(得分:1)

解决了httpd.conf中的以下条目

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

答案 9 :(得分:0)

当我使用Angular将记录发布到Django REST后端时,我遇到了这个问题。有时,这个问题没有特别的原因。仔细检查您的Django的错误消息,您将找到解决方案。

答案 10 :(得分:0)

请在Javascript中找到XMLHTTPREQUEST中使用的用于设置请求标头的函数。

...

xmlHttp.setRequestHeader("Access-Control-Allow-Origin", "http://www.example.com");
...
</script>

参考:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader