【问题标题】:Pure node.js/expressjs http redirection with single node file纯 node.js/express js http 重定向与单节点文件
【发布时间】:2014-09-17 18:51:20
【问题描述】:

虽然标题可能难以理解,但我希望我能解释得足够清楚。

这是我的设置: 我拥有域名 www.mysite.com 虽然 Godaddy。它使用 no-ip 指向特定的 ip(比如说 1.2.3.4)

设置一些子域(通过A记录):

www.dev.mysite.com -- points to 1.2.3.4
www.pi.mysite.com  -- points to 1.2.3.4
www.mysite.com     -- also points to 1.2.3.4

此设置全部托管在运行 node.js 的树莓派上(带有用于网络服务器的 express)。

我的节点文件(server.js)开始一切看起来像这样:

var express = require("express"), http = require("http");
var server = express();

// proxy server
http.createServer(function (request, response) {
    if (request.headers.host === "mysite") {
        console.log("Request made to mysite.com");
        res.redirect("http://localhost:5555");
    } else if (request.headers.host === "dev.mysite") {
        console.log("Request made to dev.mysite.com");
        res.redirect("http://localhost:5556");
    } else if (request.headers.host === "pi.mysite") {
        console.log("Request made to dev.mysite.com");
        // DROP ALL TRAFFIC EXCEPT FOR PORT 21
    } else {
        console.log("Request made to something else");
    }
}).listen(80);
process.setuid("pi"); // go back to being a basic user

// main server
server.use(express.static(__dirname + "/main"));
server.listen(5555, function(err) {
    console.log("server listening on port 5555");
});

// dev server
server.use(express.static(__dirname + "/dev"));
server.listen(5556, function() {
    console.log("server listening on port 5556");
});

以下是我的问题。我认为它们都驻留在上述文件中

  1. server.use() 需要以某种方式位于每个 server.listen() 内部,因为每个服务器都有自己的文件夹,用完

  2. 我的 res.redirect() 不起作用

  3. 我不知道如何丢弃除端口 21 之外的所有流量。这里的重点是给我一个简单的 url,以便我可以 ssh 进入。但由于 pi.mysite.com 指向与 www 相同的 ip。 mysite.com,我不想提供我的主页。所以我想我会把所有流量都丢到那个子域。

注意事项:

  • 我还想提一下,我已经尝试了 nginxhttp-proxy 的流量路由。我对他们两个都有问题,并想我会尝试这种内联方法以使其更简单。原来事情没那么简单。

  • 我想将这一切保存在 1 个文件 (server.js) 中,以便我可以将“node server.js”放入启动脚本中以在启动时运行。

  • 我知道这可能不是最有效的方法。我在学习。忍耐一下

  • 我也知道我不应该以 root 身份运行它(使用 sudo)。我这样做是为了在端口 80 上绑定我的侦听器。我使用 setuid("user") 来解决这个问题(希望如此)

这就是我现在能想到的。请让我知道如何修复和改进此过程。我会根据需要用更多信息更新问题。谢谢

【问题讨论】:

    标签: node.js express webserver reverse-proxy http-redirect


    【解决方案1】:

    您应该为开发服务器和主服务器使用两个不同的对象。这是带有代理服务器部分的 server.js:

    server.js

    var express = require("express"), http = require("http");
    var server1 = express();
    var server2 = express();
    
    // main server
    server1.use(express.static(__dirname + "/main"));
    server1.listen(5555, function(err) {
        console.log("server listening on port 5555");
    });
    
    // dev server
    server2.use(express.static(__dirname + "/dev"));
    server2.listen(5556, function() {
        console.log("server listening on port 5556");
    });
    

    就代理服务器而言,您正在使用http.createServer 收听,这是不是 express,因此 express 的 res.redirect() 函数将不可用。改为这样做:

    http.createServer(function (request, response) {
        if (request.headers.host === "mysite") {
            console.log("Request made to mysite.com");
            response.writeHead(302, { Location: "http://localhost:5555" });
            response.end();
        } else if (request.headers.host === "dev.mysite") {
            console.log("Request made to dev.mysite.com");
            res.redirect("http://localhost:5556");
        } else if (request.headers.host === "pi.mysite") {
            console.log("Request made to dev.mysite.com");
            // DROP ALL TRAFFIC EXCEPT FOR PORT 21
            response.end();
        } else {
            console.log("Request made to something else");
        }
    }).listen(80);
    

    这将向您的浏览器发送重定向。我不确定那是你真正想要的。

    【讨论】:

    • 很好的答案!没有完全掌握“http”与 express 是分开的。你知道我如何在没有管理员身份的情况下监听 80 端口吗?
    • 你不能,至少不禁用某些安全性。它基本上是为了防止恶意软件打开受信任的端口并伪装成系统服务(ssh、ftp、http 等)。查看unix.stackexchange.com/questions/16564/…
    猜你喜欢
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多