我已经设置了一个 Apache 反向代理来转发api.mydomain.com
,localhost: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 处理域通信有关!