我目前正在运行两个站点,一个基于PHP,一个基于node.js。 node.js版本是api所以我们称之为#34; api.com"
php网站(php.com)是基于HTML / JS角度的可视化网站" php.com"呼叫" api.com"使用角度资源POST。所以一切都很好,直到最近我才开始解决这个错误。
MLHttpRequest cannot load https://api.com/create.
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://php.com' is therefore not allowed access.
The response had HTTP status code 400.
所以要注意一些事情。 api.com来自https网站,其中php为http。
在node.js restify api.com网站上,它正在做我认为对CORS支持所必需的。
// Allow CORS since other sites may be calling this
server.use(
function crossOrigin(req,res,next){
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept" ); // was "X-Requested-With"
return next();
}
);
然而,它似乎仍然给出相同的CORS错误。我不熟悉这个CORS的东西,所以不确定PHP服务器或节点服务器是否需要发出标头以允许此调用发生?
为了理智,我尝试将以下内容添加到php.com .htaccess文件中......
Header set Access-Control-Allow-Origin "*"
但又一次没有运气。 真的很困惑发生了什么以及如何正确地做到这一点。我很确定这是一个简单的错误,所以我在解释如何提出建议时非常感激
**浏览器(chrome) - >网络服务器(php.com) - > api服务器(node.js)**
以及哪些服务器应该发送CORS标头
答案 0 :(得分:1)
使用server.opts方法为OPTIONS请求创建自己的处理程序。以下是您可以使用的示例。
另请告诉我,如果您在从浏览器发出请求时使用set-credentials标志为true。在这种情况下,此句柄必须使用访问cookie进行响应。
在下面的示例中,我将返回允许的原点以进行完全匹配。您可以将其调整为子串匹配。但是总是返回响应头“Access-Control-Allow-Origin”中请求头部原点中找到的确切值。这是一个很好的做法。
server.opts('/api/(.)*', (req, res) => {
const origin = req.header('origin');
const allowedOrigins = ['example.com', 'example.org'];
if (allowedOrigins.indexOf(origin) === -1) {
//origin is not allowed
return res.send(405);
}
//set access control headers to allow the preflight/options request
res.setHeader('Access-Control-Allow-Origin', header);
res.setHeader('Access-Control-Allow-Headers', 'Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version');
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS');
// Access-Control-Max-Age header catches the preflight request in the browser for the desired
// time. 864000 is ten days in number of seconds. Also during development you may want to keep
// this number too low e.g. 1.
res.setHeader('Access-Control-Max-Age', 864000);
return res.send(200);
});