【发布时间】:2012-09-06 08:28:09
【问题描述】:
我已经设置了一个 Apache 反向代理来将 api.mydomain.com 转发到 localhost:2000,它工作得很好。
但是,我遇到的真正问题是关于会话 - 通过api.mydomain.com 查询时似乎没有存储 req.session。来自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 配置
<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
Apache v2.4.2
ExpressJS v3.0.0rc4
更新 2
嗯,到目前为止,我已经决定简单地使用mydomain.com/api,因为这似乎可以解决所有问题。所以我想这只是与 Apache 如何使用 Express 处理域通信有关!
【问题讨论】:
-
值得注意的是,我在这里使用配置尝试了与 nginx 完全相同的事情 - blog.argteam.com/coding/… 但没有 ssl 并产生了与上述相同的问题。 SSL 是会话的要求吗?
-
我在尝试复制您的问题时遇到了类似的问题 - 直到我清除了浏览器 cookie。清除 cookie 后,您能否验证问题是否仍然存在?您使用什么浏览器/HTTP 客户端来处理请求?
-
@zzen,使用 Chrome 和 Firefox。每当这些事情发生时,我都会确保清除我的缓存,但似乎没有帮助。值得注意的是,当在目录而不是子域(例如 domain.com/api 而不是 api.domain.com)上运行时,我有反向代理工作,这让我认为这完全是域处理的问题表达..
-
你还能添加关于node、express和apache版本的信息吗?我已经复制了你的代码和 apache 配置,并且一切正常(在清除我的 cookie 之后)。
-
@zzen 这很奇怪 - 更新了。
标签: apache node.js session proxy express