【问题标题】:Node.js: url route with the CNAME recordNode.js:带有 CNAME 记录的 url 路由
【发布时间】:2026-01-26 20:15:01
【问题描述】:

我想将 example.orgcname.example.org 映射到两个不同的 node.js 应用程序。 但不要使用 nginx 等 http web 服务器。

而网络框架是express

那么 express 或 node.js 中是否有任何中间件可以做到这一点?

【问题讨论】:

    标签: node.js express url-routing


    【解决方案1】:

    Express 使用 connect,所以你可以这样做:

    var express = require('express'),
        app = express();
    
    app.use(express.vhost('example.org', require('./exampleApp/')));
    app.use(express.vhost('cname.example.org', require('./cnameExampleApp/')));
    
    app.listen(80);
    

    github上也有一个例子: https://github.com/visionmedia/express/tree/master/examples/vhost

    这里是 connect.vhost 的参考: http://www.senchalabs.org/connect/vhost.html

    编辑:在最近的 express 版本中,大多数中间件(如 vhost)不包括在内,因此您必须手动安装它们。

    首先,运行:

    $ npm install --save vhost
    

    更新代码sn-p:

    const express = require("express");
    const vhost = require("vhost");
    
    const app = express();
    
    app.use(vhost("example.org", require("./exampleApp/")));
    app.use(vhost("cname.example.org", require("./cnameExampleApp/")));
    
    app.listen(80);
    

    【讨论】:

      【解决方案2】:

      如果您的 2 节点应用程序托管在同一主机上,则无论如何您都需要像 nginx 这样的代理。

      var request = require('request');    
      
      var proxy = require('http').createServer(function (req, res) {    
      
          // distribute by request header 'host'
          var targetHost = req.headers.host;
          if (targetHost === 'example.org') {
            req.pipe(request('http://your-node-app1' + req.url)).pipe(res);
          } else if (targetHost === 'cname.example.org') {
            req.pipe(request('http://your-node-app2' + req.url)).pipe(res);
          } else { // not found or host is invalid
            res.statusCode = 404;
            res.end('host is not found!');
          }
      });
      
      proxy.listen(80); // assume it listens to port 80
      

      【讨论】: