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

IT技术 javascript jquery ajax cors xmlhttprequest
2021-01-25 21:19:52

我正在使用 .htaccess 来重写 url,并且我使用了 html base 标签以使其工作。

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

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

6个回答

使用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

那篇博文谈论的是 Node.js 和 express。不是客户端 javascript。谁能确认这是否有效?
2021-03-12 21:19:52
它显示 addheader 未定义。你能解释一下吗?
2021-03-22 21:19:52
我不认为这个配置只能在客户端完成..至于把它放在哪里,它会在服务器端代码上(大概是在构建对请求的响应时)
2021-03-28 21:19:52
这个应该加在哪里?
2021-03-31 21:19:52
我把这些线放在哪里?
2021-04-07 21:19:52

为什么会出现错误:

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

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

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

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

解决方案:

如上所述,源(带有 JavaScript 的页面所在的位置)和目标(JavaScript 试图到达的位置)域必须完全相同

你的情况似乎是一个错字。看起来http://wordicious.comhttp://www.wordicious.com实际上是相同的服务器/域。因此,要修复,请同样输入目标和来源:使您的 Ajax 代码请求页面/服务http://www.wordicious.com不是http://wordicious.com(可能将目标 URL 相对放置,例如'/login.php',不带域)。



更一般的说明:

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

对于 .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>
一个更好的解决方案。谢谢
2021-03-16 21:19:52
即使在 2 年后工作:p
2021-03-17 21:19:52
非常感谢。你救了我一整天。
2021-03-19 21:19:52
@SyedAliTaqi 问题是 php,这就是答案被低估的原因。但是它也对我有用:)
2021-03-31 21:19:52

如果您从浏览器收到此错误消息:

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

当您尝试向不受您控制的远程服务器执行 Ajax POST/GET 请求时,请忘记这个简单的修复:

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

您真正需要做的是,特别是如果您只使用 JavaScript 来执行 Ajax 请求时,是一个内部代理,它接收您的查询并将其发送到远程服务器。

首先在您的 JavaScript 中,对您自己的服务器执行 Ajax 调用,例如:

$.ajax({
    url: yourserver.com/controller/proxy.php,
    async:false,
    type: "POST",
    dataType: "json",
    data: data,
    success: function (result) {
        JSON.parse(result);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});

然后,创建一个名为 proxy.php 的简单 PHP 文件来包装您的 POST 数据并将它们作为参数附加到远程 URL 服务器。我举了一个例子,说明我如何使用 Expedia 酒店搜索 API 绕过这个问题:

if (isset($_POST)) {
  $apiKey = $_POST['apiKey'];
  $cid = $_POST['cid'];
  $minorRev = 99;

  $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;

  echo json_encode(file_get_contents($url));
 }

通过做:

 echo json_encode(file_get_contents($url));

您只是在执行相同的查询,但在服务器端,然后它应该可以正常工作。

@NizarBsb 你疯了你知道!!!!!:D,非常感谢你的回答救了我的命
2021-03-13 21:19:52

您需要在 php 页面“login.php”的开头添加它

<?php header('Access-Control-Allow-Origin: *'); ?>
绝对不安全。
2021-04-08 21:19:52