我正在使用.htaccess来重写网址,我使用了html基本标记以使其正常工作。
现在,当我尝试发出ajax请求时,我收到以下错误:
XMLHttpRequest无法加载http://www.wordicious.com/login.php。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://wordicious.com”访问。
答案 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.com
和http://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