6

我已经设置了一个 Apache 反向代理来转发api.mydomain.comlocalhost:2000它工作得很好。

但是,我遇到的真正问题是关于会话 - 似乎 req.session 在通过查询时没有被存储api.mydomain.com。会话将工作得很好从访问localhost:2000

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

服务器.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';
});

阿帕奇配置

<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 /session 请求 - 节点也没有重新启动)。

本地主机: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

阿帕奇 v2.4.2

ExpressJS v3.0.0rc4

更新 2

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

4

6 回答 6

4

将以下内容添加到 server.js

app.enable('trust proxy');

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

信任代理 - 启用反向代理支持,默认禁用

于 2012-09-06T12:47:08.300 回答
3

Apache ProxyPass 和 Sessions判断这个 apache 配置也许 ...

<VirtualHost *:80>
    ServerName api.mydomain.com   
    ProxyPass / http://localhost:2000/
    ProxyPassReverse / http://localhost:2000/
    ProxyPassReverseCookiePath / /
</VirtualHost>
于 2012-09-06T14:42:51.710 回答
2

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

RequestHeader set X-Forwarded-Proto "https"

我在https://github.com/expressjs/session/issues/251的最后评论之一中发现了这个特殊的宝石

所以总的来说,我为修复它而实施的事情如下:

  1. 对 Apache 配置的更改:

RequestHeader set X-Forwarded-Proto "https" ProxyPassReverseCookiePath / /

  1. 对节点应用程序的更改。

app.enable('trust proxy');

于 2017-05-10T16:50:29.647 回答
1

查看被转发的会话 cookie 并查看为什么您的浏览器在代理时不重新发送它应该很简单——域或路径可能是错误的。

回复:你后来的评论——也许你真的设置了“ProxyPassReverseCookieDomain //”而不是使用域作为参数?

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

于 2012-09-10T12:27:09.930 回答
1

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

ServerName api
ServerAlias api.internal.local

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

于 2012-09-15T07:44:34.903 回答
-1

这发生在我们身上,我不认为反向 cookie 的东西可以帮助我们解决问题。

我试过了: app.use("trust proxy");

无济于事。

但是使用

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

作品。

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

于 2014-12-10T11:07:40.097 回答