纯node.js / expressjs http重定向与单节点文件

时间:2014-07-25 20:15:23

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

虽然标题可能难以理解,但我希望我能够很好地解释它。

这是我的设置: 我拥有域名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的raspberry pi上(使用express for webserver)。

我关闭所有内容的节点文件(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,这样我就可以进入。但是因为pi.mysite.com指向与www相同的ip。 mysite.com,我不想发送我的主页。所以我想我会把所有流量都放到那个子域。

  4. 备注:

    • 我还想提一下,我已经尝试了 nginx http-proxy 进行流量路由。我遇到了两个问题,并且认为我会尝试使用这种内联方法来简化它。事实证明它并非如此简单。

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

    • 我知道这不是最有效的方法。我在学习。忍受我

    • 我也知道我不应该以root身份运行它(使用sudo)。我这样做,所以我可以在端口80上绑定我的监听器。我使用setuid("用户")来摆脱这个问题(希望如此)

    我现在所能想到的一切。请告诉我如何修复和改进此过程。我会根据需要更多信息更新问题。感谢

1 个答案:

答案 0 :(得分:0)

您应该为dev和主服务器使用两个不同的对象。这是带有代理服务器部分剪辑的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进行收听,这是不表达,因此快递的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);

即将发送重定向到您的浏览器。我不确定你真正想要的是什么。