我的Meteor应用程序中有一个服务器端路由,例如,我可以在其中获取客户端的IP:
this.route('foo', {
where: 'server',
path: '/bar',
action: function () {
var ip = context.request.connection.remoteAddress;
}
});
如何访问referer字段?我需要使用Meteor接头吗?
您可以直接访问连接请求对象,该对象具有标题:
this.request.headers['referer']
像这样:
Router.map(function () {
this.route('foo', {
where: 'server',
path: '/bar',
action: function () {
console.log("All headers:", this.request.headers);
console.log("Referer:", this.request.headers['referer']);
}
})
});
我刚刚遇到了同样的问题,经过进一步的挖掘,我发现如果源页面是安全的(HTTPS),浏览器将不会发送referer。
同样,如果源文档在本地计算机上,则referer不可用。这骗了我一段时间,因为我只是在桌面上创建了一个test.html
进行测试。。。
因此,我的路由中阻止其他网站对此路由的直接请求的代码现在看起来是这样的:
action: function () {
var self = this;
var host = self.request.headers.host;
var referer = self.request.headers.referer;
var regex = new RegExp("^http(?:s)?://" + host);
if(typeof self.request.headers.referer !== "undefined" && !regex.test(referer)) {
Meteor.log.error("Access blocked from " + referer);
self.response.statusCode = 403;
self.response.end(Handlebars.templates['403']());
return;
}
}
如果设置了referer,则必须与当前主机名匹配。
您可以执行document.referrer来获取信息
或者,您可以使用历史API:history.go(-1);