带反向代理的express.js会话

时间:2012-09-06 08:28:10

标签: apache node.js session proxy express

我已经设置了一个Apache反向代理,可以将api.mydomain.com转发给localhost:2000,但效果很好。

然而,我遇到的真正问题是关于会话 - 似乎在通过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';
});

apache config

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

    ProxyPreserveHost On
    ProxyPassReverseCookieDomain api.domain.com localhost:2000
    ProxyPassReverseCookiePath / /
</VirtualHost>

修改

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

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

将导致以下内容(每行代表对应用程序的新GET /会话请求 - 节点也没有重新启动)。

本地主机:2000

Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq
Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq
Hello, your session id is sHkkESxJgzOyDhDwyTjwpNzq

api.mydomain.com

Hello, your session id is uuo4U5ierZAG8LSH1BdwTlVf
Hello, your session id is 8BxL97Bo35SDt4uliuPgnbia
Hello, your session id is 0xkqZZpzQNvTsQpbJtUlXgkR

设置信息

NodeJS v0.8.8

Apache v2.4.2

ExpressJS v3.0.0rc4

更新2

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

6 个答案:

答案 0 :(得分:4)

将以下内容添加到server.js

app.enable('trust proxy');

来自ExpressJS API文档的引用:http://expressjs.com/api.html#app-settings ...

  

trust proxy - 启用反向代理支持,默认情况下禁用

答案 1 :(得分:3)

判断Apache ProxyPass and Sessions这个apache配置可能......

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

答案 2 :(得分:1)

查看正在转发的会话Cookie应该是微不足道的,看看为什么您的浏览器在代理时不会重新发送它 - 域或路径可能是错误的。

Re:你以后的评论 - 也许你真的设置了#34; ProxyPassReverseCookieDomain / /&#34;而不是使用域作为参数?

ProxyPreserveHost也可能间接为您服务,但修复cookie更好。

答案 3 :(得分:1)

使用此配置在节点0.6.17上保持我的会话ID,表示3.0.0rc4。最初我在虚拟主机中有以下内容,但即使在更改为匹配您的配置后,它仍然有效。

ServerName api
ServerAlias api.internal.local

我得到了一个维护的Set-cookie connect.sid。

答案 4 :(得分:0)

我遇到了这个确切的问题,并尝试了其中提到的所有其他内容但未成功最后一个难题是将以下内容添加到Apache的SSL虚拟主机配置中:

RequestHeader set X-Forwarded-Proto "https"

我在https://github.com/expressjs/session/issues/251

的最后一条评论中发现了这个特殊的宝石

总的来说,我实施的修复方法如下:

  1. 对Apache Config的更改:
  2. RequestHeader set X-Forwarded-Proto "https" ProxyPassReverseCookiePath / /

    1. 对Node App的更改。
    2. app.enable('trust proxy');

答案 5 :(得分:-1)

这件事发生在我们身上,我不认为反向饼干能帮助我们解决问题。

我试过了: app.use(&#34; trust proxy&#34;);

无济于事。

然而使用

app.use("trust proxy");
app.set("trust proxy", 1);

作品。

希望这可以帮助任何有代理cookie问题的人。