【问题标题】:CORS error occurs when HTTPS applied to the my server using Let's Encrypt使用 Let's Encrypt 将 HTTPS 应用于我的服务器时发生 CORS 错误
【发布时间】:2019-05-14 06:37:06
【问题描述】:

我有一台 Digital Ocean Linux 服务器。 我在同一台服务器中部署了我的 REST API 和前端。 我的后端使用 Node.JS 运行,前端使用 AngularJS。

启用 HTTPS 后,我将所有 REST URL 更改为 HTTPS。 像这样:

var mainHost = "https://xxx.xxx.xxx.xx:7000/api";

现在我收到了这个 CORS 错误:

跨域请求被阻止:同源策略不允许读取位于https://xxx.xxx.xxx.xx:7000/api/user_manage/login 的远程资源。 (原因:CORS 请求未成功)。

我也在使用 Node.JS CORS 插件。

var cors = require('cors');
var app = express();
app.use(cors());

这始于我添加 HTTPS 并尝试了很多事情。包括更改 .htaccess 和添加一些元标记。还是不行。这是什么原因?为什么添加 HTTPS 后出现 CORS 错误?请帮我解决这个问题。

这是服务层的控制器调用:

sessionService.getAllSessions(100, 0).then(function (data) {
      console.log(data);
      $scope.allSessions = data.data;
});

这是服务层:

getAllSessions: function (limit, offset) {
    return $http({
        method: "GET",
        url: host.session_manage + '/session/' + limit + '/' + offset
    }).then(function (response) {
        return response.data;
    });
}

正如您在上一节中看到的那样,我没有在服务调用中使用标头。

这是服务器代码 sn -p :

var express = require("express");
var bodyParser = require("body-parser");
var morgan = require("morgan");
var config = require("./config");
// var cors = require('cors');

var app = express();

// app.use(cors());

// app.use(cors({
//     origin: 'https://xxxxxx.com'
// }));

app.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(); });

app.set('views', './app/views');
app.set('view engine', 'pug');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(morgan('dev'));

var session = require('./app/routes/session')(app, express);
app.use('/api/session_manage', session);
app.listen(config.port, function (err) {
    if (err) {
        console.log(err);
    } else {
        console.log("localhost:7000");
    }
});

谢谢你们。

【问题讨论】:

  • 这似乎与您在stackoverflow.com/questions/53756621/… 的问题中描述的环境相同 - 如果是这样,那么失败的原因与您的 CORS 配置无关。相反,这听起来像是在https://xxx.xxx.xxx.xx:7000 服务器上实际上没有正确配置 SSL 的问题。

标签: angularjs node.js https cors


【解决方案1】:

您正在生产中,您不想允许所有来源的 CORS 访问,但如果您需要允许来自某些指定主机的跨来源请求,您可以添加以下代码:

server.use(cors({ origin: 'https://example.com' }));

这将允许https://example.com 向您的 Express 服务器发送跨源请求,而不会妨碍同源策略。

您还可以为单个 Express 路由启用 CORS

server.get('/endpoint', cors(), function (req, res, next) { res.json({msg: 'This has CORS-enabled for only this route: /endpoint'}) })

如果您想允许多个来源,您需要使用一个函数(用于来源而不是字符串)根据发出请求的来源和您指定的包含允许来源的白名单动态设置 CORS 标头.

var whitelist = ['http://example.com', 'http://othersite.com']; var options = { origin: function (origin, callback) { if (whitelist.indexOf(origin) !== -1) { callback(null, true) } else { callback(new Error('Not allowed by CORS')) } } } server.use(cors(options))

【讨论】:

  • 非常感谢好友的回答。我正在检查这个解决方案,很快就会回复你... :-) 希望你能拯救我的一天 :-)
  • 您能否将您的 http 请求发送给我,您是如何从 angularjs 制作它的。您还需要从 http 请求发送标头来处理 cors。
  • 否则你也可以不用 cors 模块 app.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(); });
  • 这个 "app.use(function(req, ...... " , 我需要在服务器端或客户端添加这个吗?
猜你喜欢
  • 2018-10-12
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2017-04-30
相关资源
最近更新 更多