CORS 标头“Access-Control-Allow-Origin”丢失

问题描述 投票:0回答:10

我从我的 asp.net 表单调用此函数,并在调用 ajax 时在 firebug 控制台上收到以下错误。

跨源请求被阻止:同源策略不允许读取 http://anotherdomain/test.json 处的远程资源。 (原因:CORS 标头

Access-Control-Allow-Origin
丢失)。

var url= 'http://anotherdomain/test.json';
        $.ajax({
            url: url,
            crossOrigin: true,
            type: 'GET',
            xhrFields: { withCredentials: true },
            accept: 'application/json'
        }).done(function (data) {
            alert(data);                
        }).fail(function (xhr, textStatus, error) {
            var title, message;
            switch (xhr.status) {
                case 403:
                    title = xhr.responseJSON.errorSummary;
                    message = 'Please login to your server before running the test.';
                    break;
                default:
                    title = 'Invalid URL or Cross-Origin Request Blocked';
                    message = 'You must explictly add this site (' + window.location.origin + ') to the list of allowed websites in your server.';
                    break;
            }
        });

我已经采取了替代方法,但仍然无法找到解决方案。

注意:我没有服务器权限来进行服务器端(API/URL)更改。

jquery ajax json cors jsonp
10个回答
92
投票

这种情况通常发生在您尝试访问另一个域的资源,而另一个域的 cors 源白名单中没有您的域时。

要访问域中的资源,必须事先获得该域的“cors origin”策略的授权。

这是一项安全功能,可以避免其他域使用您服务器上的资源,或者有助于防止 网站欺骗

如果您可以控制两个域服务器,则可以解决此问题:

解决方案1:通过
.htaccess

您可以将其写入

请求的域
文件的.htaccess中:

=> 不推荐允许所有域

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    </IfModule>

=> 推荐 仅允许预期的域

    <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin 'https://my-domain.example'
    </IfModule>

解决方案 2:以正确的方式设置标题

如果您将其设置到所请求文件的响应标头中,您将允许每个人访问资源:

=> 不推荐允许所有域

Access-Control-Allow-Origin : *

=> 推荐 仅允许预期的域

Access-Control-Allow-Origin : http://www.my-domain.example

10
投票

服务器端将其放在

<filename>.php
之上:

header('Access-Control-Allow-Origin: *');

您可以设置特定域限制访问:

header('Access-Control-Allow-Origin: https://www.example.com');

8
投票

在你的ajax请求中,添加:

dataType: "jsonp",

行后:

type: 'GET',

应该解决这个问题..

希望这对你有帮助


3
投票

如果您在后端使用 Express js,您可以安装包 cors,然后在您的服务器中使用它,如下所示:

const cors = require("cors");
app.use(cors());

这解决了我的问题


1
投票

这对我有用:

创建 php 文件,该文件将在不使用 js 的情况下下载另一个域页面的内容:

<?
//file name: your_php_page.php
echo file_get_contents('http://anotherdomain/test.json');
?>

然后在ajax(jquery)中运行它。示例:

$.ajax({
  url: your_php_page.php,
  //optional data might be usefull
  //type: 'GET',
  //dataType: "jsonp", 
  //dataType: 'xml',
  context: document.body
}).done(function(data) {

  alert("data");
  
}); 

0
投票

您必须修改服务器端代码,如下所示

public class CorsResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext,   ContainerResponseContext responseContext)
    throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");

  }
}

0
投票

看完以上答案,你一定知道为什么会遇到这个问题了。

self.send_header('Access-Control-Allow-Origin', '*')

您只需在服务器端添加上述行即可。


0
投票

如果您使用 Google Cloud Armor,并且它由于 SQL 注入尝试等安全策略而拒绝请求,也可能会发生这种情况。在这种情况下,它只会返回一个带有

403 Forbidden
的 HTML 页面,并且没有您期望的标头:

HTTP/2 403 Forbidden
content-length: 134
content-type: text/html; charset=UTF-8
date: Tue, 28 Mar 2023 16:55:21 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
X-Firefox-Spdy: h2

0
投票

相当老的话题,但我也遇到了同样的问题。就我而言,它是“http://”应用程序尝试调用同一页面但使用“https://”。 而不是调用它:

var url = 'https://example.com/page'

我用过

var url = 'http://example.com/page'

一切正常。

您还可以使用:

var url = 'page'

-4
投票

在紧要关头,您可以使用此 Chrome 扩展程序在本地浏览器上禁用 CORS。

允许 CORS:访问控制允许来源 Chrome 扩展

© www.soinside.com 2019 - 2024. All rights reserved.