我已经设置了一个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!的域通信有关...
答案 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
的最后一条评论中发现了这个特殊的宝石总的来说,我实施的修复方法如下:
RequestHeader set X-Forwarded-Proto "https"
ProxyPassReverseCookiePath / /
app.enable('trust proxy');
答案 5 :(得分:-1)
这件事发生在我们身上,我不认为反向饼干能帮助我们解决问题。
我试过了: app.use(&#34; trust proxy&#34;);
无济于事。
然而使用
app.use("trust proxy");
app.set("trust proxy", 1);
作品。
希望这可以帮助任何有代理cookie问题的人。