https.listen忽略主机名

时间:2016-05-10 18:54:12

标签: node.js express https hostname

我尝试将https服务器绑定到我的子域(cdn.somedomain.com)。但是https.listen(443,'cdn.somedomain.com')会忽略主机名。他试图绑定ip并因此绑定所有地址。

var fs = require('fs');
var https = require('https');
var express = require('express');
var app = express();
var subdomain = require('express-subdomain');
var router = express.Router();
var options = {
   key  : fs.readFileSync('/path/to/privkey.pem'),
   cert : fs.readFileSync('/path/to/cert.pem'),
   hostname: 'cdn.somedomain.com'
};

router.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});
router.use(express.static('somefiles'));
app.use(subdomain('cdn', router));

https.createServer(options, app).listen(443, 'cdn.somedomain.com');

我已经尝试过使用'express-subdomain',你可以在我的代码中看到。

我希望你能帮助我。

尼尔斯

2 个答案:

答案 0 :(得分:1)

listen函数正在获取您的hostname参数并将其解析为IP地址,因此它会忽略""忽略"主机名。

源: node.js:: what does hostname do in `listen` function?

不希望它绑定所有地址吗?或者您是否试图忽略您的主域名?

使用您的路由器处理不同的域:

var v1Routes = express.Router();
var v2Routes = express.Router();

v1Routes.get('/', function(req, res) {
    res.send('API - version 1');
});
v2Routes.get('/', function(req, res) {
    res.send('API - version 2');
});

router.use(subdomain('*.v1', v1Routes));
router.use(subdomain('*.v2', v2Routes));

这是正确的文件: https://github.com/bmullan91/express-subdomain

答案 1 :(得分:1)

听起来像你想要virtual hosting,你的服务器只会将与特定主机名( cdn.somedomain.com )匹配的请求传递给路由器。

您可以使用vhost模块:

var vhost = require('vhost');
...
app.use(vhost('cdn.somedomain.com', router));