执行重定向时浏览器控制台出错 请求的资源上不存在“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”标头的主要内容,如果未能解决你的问题,请参考以下文章
如何调试“请求的资源上不存在‘Access-Control-Allow-Origin’标头”
Http.post 请求的资源上不存在“Access-Control-Allow-Origin”标头