执行重定向时浏览器控制台出错 请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】执行重定向时浏览器控制台出错 请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:Error in browser console when I do a redirect No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2016-07-08 05:33:59 【问题描述】:

我有一个运行在http://localhost:9000 的AngularJS 应用程序。前端应用程序针对http://localhost:8088 执行http 请求。因此,我必须在响应标头上设置 CORS。

我在客户端添加:

delete $http.defaults.headers.common["X-Requested-With"];
$http.defaults.headers.common["Accept"] = "application/json";
$http.defaults.headers.common["Content-Type"] = "application/json";

服务器端(ExpressJS):

app.use(function(req, res, next)   
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Origin", "*");  
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');  
    next();  
);

当我调用 //localhost:9000 -> //localhost:8088 时一切正常。但是,当我重定向到不同的 url (//api.example.com/authorize) 时,我在浏览器控制台中收到以下错误:XMLHttpRequest cannot load //api.example.com/authorize?response_type=code .请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'null'。

 app.use(function(req, res, next)   
     res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
     res.header("Access-Control-Allow-Origin", "*");
     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
     next();
 );

 app.get('/authorize', function (req, res)   
    var response = 'https://api.example.com/authorize?response_type=code';  
    res.redirect(response);  
 );  

你有什么线索吗?

【问题讨论】:

是的,问题是api.example.com 没有响应访问控制标头。 【参考方案1】:

问题似乎与重定向和 CORS 有关。 状态码为 301、302、303、307 或 308 的重定向会导致错误。 这正在更改,但现在您需要一种解决方法,例如在响应标头或正文中发回重定向 URL,而不使用重定向。

这在other reply中有很好的解释

从那里引用:

在浏览器赶上之前,唯一可行的选择似乎是一个或一个 组合:

    仅针对简单请求发出重定向。 发出 305 重定向,在 Location 标头中使用您自己的 URL 作为“代理”。为有限的浏览器支持做好准备,因为 305 是 已弃用。 做一个假的“重定向”: 返回带有元刷新和/或 javascript 位置更改的 html。 返回具有视口填充 iframe 且重定向目标作为 iframe 源的 HTML。 显示用户必须单击才能访问内容的链接。

最后我做的是把链接放在客户端,我认为这是最简单和最干净的。

【讨论】:

以上是关于执行重定向时浏览器控制台出错 请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

Spring 跨重定向请求传递数据

如何调试“请求的资源上不存在‘Access-Control-Allow-Origin’标头”

HTTP的响应码?

Http.post 请求的资源上不存在“Access-Control-Allow-Origin”标头

在 CodeIgniter 4 中提交表单后重定向页面无法工作

php 在验证请求时出错后覆盖默认重定向回路由