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

125

我正在使用express.js,需要知道发起调用的域名。以下是简单的代码:

app.get(
    '/verify_license_key.json',
    function( req, res ) {
        // do something
我怎样从reqres对象中获取域名? 我的意思是我需要知道API是由somesite.example还是someothersite.example调用的。 我尝试通过对reqres进行console.dir,但是我无法从其中得到任何想法,同时也阅读了文档,但没有帮助。

1
尝试使用 req.hostreq.get('host') 来获取主机名 参考文档 - dc5
3
node.js:req.headers["x-forwarded-for"] || req.connection.remoteAddressx-forwarded-for 可以在代理、负载均衡等情况下覆盖您的基础需求。 - Eat at Joes
我收到了如下警告信息:express deprecated req.host: Use req.hostname instead index.js:20:8 - Adam Fowler
"我需要知道API是否是由somesite.example调用的。" - Stijn de Witt
5个回答

211

您必须从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,则可以使用以下代码获取:

var userIP = req.socket.remoteAddress;
请注意,如果您的服务器在代理后面,这可能会给您代理的IP地址。您能否获取用户的IP取决于代理传递的信息。但通常也会在标头中找到它。

1
但这不是给我API的主机吗?这可能是因为我正在本地进行此操作,并且将api.time.ly设置为解析为127.0.0.1,而我正在从localhost发出调用,但如果我使用它,主机是“api.time.ly”,我需要知道调用我的域。我将在现场测试此功能。 - Nicola Peluchetti
1
@NicolaPeluchetti 我猜我不明白你所说的“呼叫我的域”是什么意思。HTTP客户端通常不会在请求中提供自己的主机名。这是为了CORS吗? - Jonathan Lonowski
我有一个位于api.time.ly的中央API。不同的客户网站安装了我们的WordPress插件并调用此API。因此,我们可能会看到http://church1.com和http://sauna1.com对我们的API进行调用。在API中,我能否获取调用是来自http://church1.com还是http://sauna1.com?我看到一个标题`'user-agent': 'WordPress/3.6; http://localhost/wordpress_clean'`,我应该解析它吗? - Nicola Peluchetti
如果没有传递域名,不是问题,我可以显然地将它添加到 API 调用中。 - Nicola Peluchetti
嗨,可能在调用中传递参数是最好的选择,我只需要知道域来执行一些检查,以查看是否在多个站点上使用了相同的许可证。我会将此标记为答案。 - Nicola Peluchetti
显示剩余2条评论

54

改为:

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

你也可以使用:

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

23
获取 undefined - Himanshu Bansal
给我 127.0.0.1:3000。 - user1709076
127.0.0.1:3000类似于localhost:3000,我相信。127.0.0.1指的是本地IP地址。 - Jarrett

18

20
这将返回您收到请求的服务器的主机名。 只有在您在同一台服务器上运行API和网站,并且发起和接收方是相同的主机时,它才能工作。 - Paul T. Rawkeen
1
这将返回托管代码的服务器的主机名,而不是源... - Pencilcheck
“包含从Host HTTP头派生的主机名”,以及“ Host请求头指定发送请求的服务器的主机名和端口号”... 所以这不是起源... - Luis

6

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.

3

2022年,我使用express v4.17.1得到以下结果:

var host = req.get('host'); // 可用,localhost:3000

var host = req.headers.host; // 可用,localhost:3000

var host = req.hostname; // 可用,localhost

var origin = req.get('origin'); // 不可用,undefined

var origin = req.headers.origin; // 不可用,undefined

enter image description here


var host = req.get('host'); // 正常工作,localhost:3003 // 服务器主机,没有来源 (3000)... - Luis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接