如何解决“重定向已被 CORS 策略阻止:没有 'Access-Control-Allow-Origin' 标头”?

Posted

技术标签:

【中文标题】如何解决“重定向已被 CORS 策略阻止:没有 \'Access-Control-Allow-Origin\' 标头”?【英文标题】:How to solve 'Redirect has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header'?如何解决“重定向已被 CORS 策略阻止:没有 'Access-Control-Allow-Origin' 标头”? 【发布时间】:2018-03-13 08:40:28 【问题描述】:

我正在使用Vue js 开发一个应用程序。 根据我的设置,我需要在设置更改时将变量传递给我的 URL。

<!-- language: lang-js -->

    $.get('http://172.16.1.157:8002/firstcolumn/' + c1v + '/' + c1b, function (data)  
      // some code...
    );

但是当我的应用点击 URL 时,它会显示以下消息。

Failed to load http://172.16.1.157:8002/firstcolumn/2017-03-01/2017-10-26: Redirect from 'http://172.16.1.157:8002/firstcolumn/2017-03-01/2017-10-26' to 'http://172.16.1.157:8002/firstcolumn/2017-03-01/2017-10-26/' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

【问题讨论】:

这个问题是因为同源策略阻止响应被接收,因为由于端口号的不同,发起/接收域不同。要解决此问题,您需要在来自http://172.16.1.157:8002/firstcolumn/... 的响应中返回 CORS 标头。具体如何执行取决于您使用的服务器端基础架构。 Why does my javascript get a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error when Postman does not?的可能重复 在这种情况下,Origin A 向 Origin B 发出 GET 请求;响应重定向到 Origin B 中的不同位置。解决方案是诱使 Chrome 认为 Origin B 是 Origin A。如果 Origin B 重定向到 Origin C 怎么办?我们可以直接指向任何 Origin C,还是必须欺骗 Origin C 以显示为 Origin A?我认为我们 可以 重定向到任何 Origin C(例如重定向到第三方单点登录页面或 www.***.com ),无论 Origin A 或 Origin C 的 Access-Control-Allow-Origin 标头如何) 在我的情况下,没有一个答案有效,最后结果是我的中间件(在本地服务器中)出现错误。以防它帮助某人 【参考方案1】:

除了 awd 提到的让负责服务器的人员重新配置(本地开发的一个不切实际的解决方案)之外,我还使用了一个 change-origin chrome 插件,如下所示:

Moesif Orign & CORS Changer

您可以让您的local dev server (ex: localhost:8080) 看起来像是来自172.16.1.157:8002 or any other domain

【讨论】:

我不知道如何设置它,你能进一步解释一下吗?截图会很好。 @altShiftDev 这个插件是否有任何选项可以处理:“对预检请求的响应未通过访问控制检查:预检请求不允许重定向。”? 尝试把你的真实IP而不是本地主机。尝试用谷歌搜索你的 ip 并用 @Black 替换“localhost” 很好的建议 一句警告:Moesif Origin & CORS Changer 插件要求您输入与工作相关的电子邮件地址才能访问高级设置。我不会推荐。【参考方案2】:

谢谢大家,我通过chrome上的这个扩展解决了。

Allow CORS: Access-Control-Allow-Origin

【讨论】:

链接现在断开了:( 链接失效,完全没有描述。 更新链接我的朋友! chrome.google.com/webstore/detail/allow-cors-access-control/… 扩展只是一个临时修复,并不是问题的解决方案【参考方案3】:

如果你可以控制你的服务器,你可以使用 php

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

【讨论】:

最好添加到 .htaccess 文件中,这将适用于整个项目,而不仅仅是您添加此 sn-p 的站点。 我可以知道如何从角度解决这个问题吗? 非常感谢!这有效...... Cheerio! 对我来说它甚至没有到达 php 脚本【参考方案4】:

请在http://172.16.1.157:8002/ 维护服务器的人员将您的主机名添加到 Access-Control-Allow-Origin 主机,服务器应返回类似于以下内容的标头以及响应-

Access-Control-Allow-Origin: yourhostname:port

【讨论】:

@RoryMcCrossan 它说起源是本地主机,所以 cors 被触发。我想?【参考方案5】:

当您在使用 Chrome 时遇到此问题时,您不需要扩展程序。 从控制台启动 Chrome:chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security 也许您必须关闭 Chrome 中的所有选项卡并重新启动它。

【讨论】:

【参考方案6】:

您好,如果我理解正确,您正在向与您的页面所在的域不同的域发送XMLHttpRequest。因此浏览器会阻止它,因为出于安全原因,它通常允许同一来源的请求。当您想要进行跨域请求时,您需要做一些不同的事情。一个关于如何实现的教程是Using CORS。

当您使用邮递员时,他们不受此政策的限制。引用自Cross-Origin XMLHttpRequest:

常规网页可以使用 XMLHttpRequest 对象从远程服务器发送和接收数据,但它们受到同源策略的限制。扩展并没有那么有限。扩展程序可以与其源之外的远程服务器通信,只要它首先请求跨域权限。

【讨论】:

【参考方案7】:

要使用 Apache 将 CORS 授权添加到标头,只需在服务器配置的 &lt;Directory&gt;&lt;Location&gt;&lt;Files&gt;&lt;VirtualHost&gt; 部分中添加以下行(通常位于 *.conf文件,例如 httpd.conf 或 apache.conf),或在 .htaccess 文件中:

标头集 Access-Control-Allow-Origin "*"

然后重启apache。

更改标头需要使用 mod_headers。 Mod_headers 在 Apache 中默认启用,但是,您可能需要确保它已启用。

【讨论】:

添加到我的本地项目的.htaccess 中并像魅力一样工作,不要忘记重新启动您的服务器/mamp/apache,无论您使用什么。【参考方案8】:

使用 npm:

要允许跨域请求安装“cors”:

npm i cors

在服务器端添加这个:

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

【讨论】:

不起作用,伙计。【参考方案9】:

我在 Vue.js 和 SpringBoot 项目中遇到了同样的问题。如果有人使用 spring,您可以添加以下代码:

@Bean
public FilterRegistrationBean simpleCorsFilter()   
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();  
    CorsConfiguration config = new CorsConfiguration();  
    config.setAllowCredentials(true); 
    // *** URL below needs to match the Vue client URL and port ***
    config.setAllowedOrigins(Collections.singletonList("http://localhost:8080")); 
    config.setAllowedMethods(Collections.singletonList("*"));  
    config.setAllowedHeaders(Collections.singletonList("*"));  
    source.registerCorsConfiguration("/**", config);  
    FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter(source));
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE);  
    return bean;  
   

我在这篇文章中找到了解决方案Build a Simple CRUD App with Spring Boot and Vue.js

【讨论】:

【参考方案10】:

您正在从本地开发服务器向外部域 172.16.1.157:8002/ 发出请求,这就是它给出跨源异常的原因。 要么您必须在前端和后端都允许标头Access-Control-Allow-Origin:*,要么使用此扩展名cors header toggle - chrome extension,除非您将后端和前端托管在同一个域中。

【讨论】:

嘿,提供的 chrome 扩展链接已损坏。你能更新答案吗?【参考方案11】:

尝试在终端中运行此命令,然后再次测试。

curl -H "origin: originHost" -v "RequestedResource"

例如:

如果我的originHost 等于https://localhost:8081/ 并且我的RequestedResource 等于https://example.com/

我的命令如下:

curl -H "origin: https://localhost:8081/" -v "https://example.com/"

如果您能注意到以下行,那么它应该适合您。

希望这会有所帮助。

【讨论】:

【参考方案12】:

此问题的批准答案无效。

您需要在服务器端代码上设置标头

app.use((req,res,next)=>
    res.setHeader('Acces-Control-Allow-Origin','*');
    res.setHeader('Acces-Control-Allow-Methods','GET,POST,PUT,PATCH,DELETE');
    res.setHeader('Acces-Contorl-Allow-Methods','Content-Type','Authorization');
    next(); 
)

【讨论】:

【参考方案13】:

您可以使用 Firefox 插件 CORS Everywhere 暂时解决此问题。只需打开火狐,按 Ctrl+Shift+A ,搜索插件并添加即可!

【讨论】:

感谢这有助于避免所有麻烦并从本地主机测试代码。【参考方案14】:

你不会相信的, 请务必添加“。”在“网址”的末尾

我在这段代码中遇到了类似的错误:

fetch(https://itunes.apple.com/search?term=jack+johnson)
.then( response => 
    return response.json();
)
.then(data => 
    console.log(data.results);
).catch(error => console.log('Request failed:', error))

我得到的错误:

 Access to fetch at 'https://itunes.apple.com/search?term=jack+johnson'
 from origin 'http://127.0.0.1:5500' has been blocked by CORS policy:
 No 'Access-Control-Allow-Origin' header is present on the requested
 resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

但经过大量研究后,我意识到问题在于我没有复制 来自 iTunes API 文档的正确 URL 地址。

应该是

https://itunes.apple.com/search?term=jack+johnson.

不是

https://itunes.apple.com/search?term=jack+johnson

注意最后的点

对于为什么点很重要引用有关 DNS 和字符编码的问题有一个很大的解释,但事实是您可能并不关心。尝试添加可能对您也有用的点。

当我添加“。”时一切都像魅力一样。

我希望它也对你有用。

【讨论】:

这似乎对我不起作用,它实际上破坏了 API 调用。【参考方案15】:

请指定@CrossOrigin(origins = "http://localhost:8081") 在控制器类中。

【讨论】:

【参考方案16】:

您必须为您的浏览器自定义安全性或通过自定义安全性来允许权限。 (这对于您的本地测试是不切实际的) 了解更多请点击链接。https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

【讨论】:

【参考方案17】:

安装:

npm i cors

然后包含 cors():

app.get("/list",cors(),(req,res) =>

);

【讨论】:

【参考方案18】:

我遇到此错误的原因是我没有针对不同环境更新路径。

【讨论】:

【参考方案19】:

这些错误可能是由于以下原因引起的,请确保遵循以下步骤。将本地主机与本地虚拟机(主机)连接起来。在这里,我将 http://localhost:3001/ 连接到 http://abc.test 要遵循的步骤:

1.我们必须允许 CORS,将 Access-Control-Allow-Origin: 放在请求的标头中 可能不起作用。安装支持 CORS 请求的 google 扩展程序。*

2.确保您在请求中提供的凭据有效。

3.确保已配置 vagrant。尝试 vagrant up --provision 这使本地主机连接到宅基地的数据库。

    尝试更改标题的内容类型。 header: 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8;application/json' 这一点非常重要。

【讨论】:

【参考方案20】:

只需在 httpd.conf 文件中添加以下文本即可解决此问题。

标头集 Access-Control-Allow-Origin "*"

【讨论】:

【参考方案21】:
$.get('https://172.16.1.157:8002/firstcolumn/' + c1v + '/' + c1b, function (data)  
  // some code...
);

只需输入“https”即可。

【讨论】:

以上是关于如何解决“重定向已被 CORS 策略阻止:没有 'Access-Control-Allow-Origin' 标头”?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Ajax 跨域请求不到的问题

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题