Access-Control-Allow-Origin 不允许 Origin <origin>

IT技术 javascript node.js ajax google-chrome cors
2021-01-19 04:35:09
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

我阅读了跨域 ajax 请求,并了解了潜在的安全问题。就我而言,有 2 个服务器在本地运行,并且喜欢在测试期间启用跨域请求。

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

localhost:8080 - GAE server当我的页面从节点服务器加载时,我正在发出一个 ajax 请求什么是最简单、最安全的(不想用disable-web-security选项启动 chrome )。如果我必须改变'Content-Type',我应该在节点服务器上做吗?如何?

6个回答

由于它们运行在不同的端口上,因此它们是不同的 JavaScript origin它们在同一台机器/主机名上并不重要。

您需要在服务器 (localhost:8080) 上启用 CORS。看看这个网站:http : //enable-cors.org/

您需要做的就是向服务器添加一个 HTTP 标头:

Access-Control-Allow-Origin: http://localhost:3000

或者,为简单起见:

Access-Control-Allow-Origin: *

如果您的服务器尝试设置 cookie 并且您使用,请不要使用“*” withCredentials = true

响应凭据请求时,服务器必须指定域,并且不能使用通配符。

你可以withCredentials在这里阅读更多

如果我们想将此标题添加到 HTML 中,那么我们应该怎么做?
2021-03-20 04:35:09
我不认为该端口是必要的,但如果您使用的是非标准端口,例如 3000,则必须将其包含在 CORS 策略中。
2021-03-21 04:35:09
为清楚起见,当说您需要“向服务器添加 HTTP 标头”时,这意味着给定的Access-Control-Allow-Origin标头需要是服务器发送的 HTTP 响应的添加标头。这个头需要是服务器响应的一部分,它不需要是客户端请求的一部分具体发生在客户端发出您想要的实际请求之前,浏览器OPTIONS在它之前发送一个请求,如果服务器对该OPTIONS请求的响应不包含标头,浏览器将不会发送您想要的请求。
2021-03-21 04:35:09
在 enable-cors.org 上阅读有关后端服务器的相关提示非常重要。
2021-03-27 04:35:09
感谢您的回复。只是想强调在这里使用“*”作为值的安全隐患。这允许所有来源:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/... 就最少访问而言,第一个示例似乎是最好的。有关如何在此处使用多个域执行此操作的详细信息:stackoverflow.com/a/1850482/1566623
2021-04-04 04:35:09

如果您需要在 Chrome 中快速解决 ajax 请求,这个 chrome 插件会自动允许您通过添加适当的响应头来访问来自任何来源的任何站点

Chrome 扩展允许-控制-允许-来源:*

绝对同意。无需更改远程服务器的配置即可轻松为远程服务器启用本地主机开发。
2021-03-13 04:35:09
@DavidBetz:当然,考虑到您验证扩展并信任它;)
2021-03-14 04:35:09
我不知道为什么你没有得到更多的赞成。这是使用 Chrome 在 localhost 上进行开发的最少侵入性。
2021-03-16 04:35:09
这应该是最佳答案!特别是在本地主机方面。
2021-03-24 04:35:09
如果这是一个好的解决方案,那么一开始就不会发明 CORS。将此标头应用于任何主机会禁用 CORS 保护并使您暴露于恶意脚本,而不仅仅是您的。如果您的银行账户突然空了,请不要感到惊讶。
2021-04-10 04:35:09

您必须启用 CORS 才能解决此问题

如果您的应用程序是使用简单的 node.js 创建的

将其设置在您的响应标头中,例如

var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE'
});
response.end('Hello World\n');
}).listen(3000);

如果您的应用程序是使用 express 框架创建的

使用 CORS 中间件,如

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

并通过申请

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    

这是两个参考链接

  1. how-to-allow-cors-in-express-nodejs
  2. diving-into-node-js-very-first-app #参见 Ajax 部分
你能指定,如何使用config.allowedDomains说在我的情况下我应该把什么uri放在那里?
2021-03-15 04:35:09
@PrameshBajrachaya 我没有包括“app.configure”部分——只有“app.use(allowCrossDomain)”,它对我有用。
2021-03-29 04:35:09
@bsr :您可以使用*specific domain您想授予访问权限。
2021-04-04 04:35:09
所以我是唯一一个app.configure()不是函数错误的人吗?
2021-04-06 04:35:09

我接受@Rocket hazmat 的回答,因为它引导我找到解决方案。我确实需要在 GAE 服务器上设置标头。我必须设置这些

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

设置只"Access-Control-Allow-Origin" 给出错误

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

另外,如果需要发送身份验证令牌,也添加这个

"Access-Control-Allow-Credentials" -> "true"

另外,在客户端,设置 withCredentials

这会导致 2 个请求发送到服务器,一个带有OPTIONS. Auth cookie 不随它一起发送,因此需要处理外部 auth。

在 router.js 中,只需在调用 get/post 方法之前添加代码。它对我有用,没有错误。

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });