如何在Express.js中获取发起请求的域?


80

我正在使用express.js,我需要知道发起呼叫的域。这是简单的代码

app.get(
    '/verify_license_key.json',
    function( req, res ) {
        // do something

如何从reqres对象获取域?我的意思是我需要知道api是由somesite.com还是someothersite.com调用的。我试着做两者的console.dirreqres,但我还是不知道从那里,也可以参考文档,但它给了我没有帮助。


1
试试:req.hostreq.get('host') 表达文件
dc5

1
node.js:req.headers["x-forwarded-for"] || req.connection.remoteAddress x-forwarded-for可以覆盖代理,负载均衡器之后的基础...
2014年

我收到此警告:表达不推荐使用的req.host:使用req.hostname代替index.js:20:8
Adam F

Answers:


134

您必须从HOST标题中检索它。

var host = req.get('host');

它在HTTP 1.0中是可选的,但在1.1中是必需的。而且,该应用程序始终可以施加自己的要求。


如果这是为了支持跨域请求,则应改用Origin标头。

var origin = req.get('origin');

请注意,某些跨域请求需要通过预检请求进行验证:

req.options('/route', function (req, res) {
    var origin = req.get('origin');
    // ...
});

如果要查找客户端的IP,可以使用以下方法检索该IP:

var userIP = req.socket.remoteAddress;

请注意,如果您的服务器位于代理之后,则可能会为您提供代理的IP。是否可以获取用户的IP取决于代理传递的信息。但是,它通常也将出现在标题中。


1
但这不是给我api的主机吗?这可能是由于我在本地执行此操作而我将api.time.ly设置为解析为127.0.0.1造成的,而我正在拨打的电话是从本地主机,但如果我使用该主机,则主机为“ api.time.ly”,我需要知道调用我的域。我将在现场进行测试。
Nicola Peluchetti

1
@NicolaPeluchetti我想我不明白您所说的“正在呼叫我的域名含义。HTTP客户端通常不在请求中提供自己的主机名。这是CORS吗?
乔纳森·洛诺夫斯基

我有一个位于api.time.ly的中央api。此api由安装我们的wordpress插件的不同客户端网站调用。因此,我们可以让church1.comsauna1.com调用我们的api。在API中,我是否可以获取调用是从church1.com还是从sauna1.com进行的?我看到标题'user-agent': 'WordPress/3.6; http://localhost/wordpress_clean'应该解析吗?
2013年

如果没有通过域,那不是问题,我可以将其显然添加到API调用中。
Nicola Peluchetti

@NicolaPeluchetti您可以尝试拆分和解析用户代理,或将其作为请求中的数据。但是,我想说OAuth之类的东西更适合于识别客户端。
乔纳森·洛诺夫斯基

35

代替:

var host = req.get('host');
var origin = req.get('origin');

您还可以使用:

var host = req.headers.host;
var origin = req.headers.origin;

8
得到undefined
Himanshu Bansal

给我127.0.0.1:3000
user1709076


0

最近在获取'Origin'请求标头时遇到问题,然后我发现了这个问题。但是req.get('host')不赞成与结果混淆,这就是为什么给Undefined。使用,

    req.header('Origin');
    req.header('Host');
    // this method can be used to access other request headers like, 'Referer', 'User-Agent' etc.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.