带反向代理的express.js会话

cra*_*awf 5 apache session proxy node.js express

我已经设置了一个Apache反向代理转发api.mydomain.comlocalhost:2000哪个工作正常.

然而,我遇到的真正问题是关于会话 - 似乎在查询时没有存储req.session api.mydomain.com.会议将很好地访问localhost:2000.

我认为这与代理域有关...

server.js

var express = require('express'),
    app = express();

app.enable('trust proxy');

app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({ secret: 'supersecret'});
    app.use(app.router);
});

app.get('/session', function(req, res, next){ 
    console.log(req.session.username)
    // this will be undefined when called from  api.mydomain.com...
});


app.post('/session', function(req, res, next){ 
    req.session.username = 'my username';
});
Run Code Online (Sandbox Code Playgroud)

apache配置

<VirtualHost *:80>
    ServerName api.mydomain.com   
    ProxyPass / http://localhost:2000/
    ProxyPassReverse / http://localhost:2000/

    ProxyPreserveHost On
    ProxyPassReverseCookieDomain api.domain.com localhost:2000
    ProxyPassReverseCookiePath / /
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

编辑

值得注意的是,进一步测试 - app.use(app.router)app.configure()... 之前添加以下代码

app.use(function (req, res) {
    res.send('<h2>Hello, your session id is ' + req.sessionID + '</h2>');
});
Run Code Online (Sandbox Code Playgroud)

将导致以下结果(每行代表对应用程序的新GET /会话请求 - 节点尚未重新启动).

本地主机:2000

Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq
Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq
Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq
Run Code Online (Sandbox Code Playgroud)

api.mydomain.com

Hello, your session id is uuo4U5ierZAG8LSH1BdwTlVf
Hello, your session id is 8BxL97Bo35SDt4uliuPgnbia
Hello, your session id is 0xkqZZpzQNvTsQpbJtUlXgkR
Run Code Online (Sandbox Code Playgroud)

设置信息

NodeJS v0.8.8

Apache v2.4.2

ExpressJS v3.0.0rc4

更新2

好吧,到目前为止我已经决定简单使用mydomain.com/api,因为这似乎可以解决所有问题.所以我想这与Apache如何处理与Express的域通信有关!

Ben*_*ans 3

从Apache ProxyPass 和 Sessions来看,这个 apache 配置也许......

<VirtualHost *:80>
    ServerName api.mydomain.com   
    ProxyPass / http://localhost:2000/
    ProxyPassReverse / http://localhost:2000/
    ProxyPassReverseCookiePath / /
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)