Eri*_*rik 221 ip ip-address node.js express
我不完全理解我应该如何获得远程用户IP地址.
假设我有一个简单的请求路由,例如:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
Run Code Online (Sandbox Code Playgroud)
上述方法是否正确获取真实用户IP地址还是有更好的方法?那些代理呢?
ale*_*lex 419
如果您在NGiNX之类的代理服务器后面运行,或者您有什么,那么您应该检查'x-forwarded-for':
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
Run Code Online (Sandbox Code Playgroud)
如果代理不是'你的',我不会相信'x-forwarded-for'标题,因为它可能是欺骗性的.
Hao*_*hun 217
虽然@alessioalex的答案有效,但还有另一种方法,如快递指南中的Express背后部分所述.
app.set('trust proxy', true)
到您的快速初始化代码.req.ip
或req.ips
以通常的方式(就好像没有反向代理)如果您需要比信任x-forwarded-for标头中传递的所有内容更复杂的东西,并且您的代理不会从不受信任的来源中删除预先存在的x-forwarded-for标头,则可以使用更多"信任代理"选项.有关详细信息,请参阅链接指南.
注意:req.ip
不适用于我的解决方案.
小智 51
在nginx.conf
档案中:
proxy_set_header X-Real-IP $remote_addr;
在node.js
服务器文件中:
var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
请注意,表示小写标题
Edw*_*rzo 28
特别是对于节点,http服务器组件的文档在事件连接下说:
[Triggered]建立新TCP流时.[socket]是net.Socket类型的对象.通常用户不希望访问此事件.特别是,由于协议解析器如何附加到套接字,套接字将不会发出可读事件.也可以访问套接字
request.connection
.
所以,这意味着request.connection
是一个套接字,根据文档确实有一个socket.remoteAddress属性,根据文档是:
远程IP地址的字符串表示形式.例如,'74 .125.127.100'或'2001:4860:a005 :: 68'.
在express下,请求对象也是Node http请求对象的一个实例,因此这种方法仍然有效.
但是,在Express.js下,请求已经有两个属性:req.ip和req.ips
req.ip
返回远程地址,或启用"信任代理" - 上游地址.
req.ips
当"信任代理"是
true
,解析"X-Forwarded-For"ip地址列表并返回一个数组,否则返回一个空数组.例如,如果值为"client,proxy1,proxy2",您将收到数组["client","proxy1","proxy2"],其中"proxy2"是最下游的.
值得一提的是,根据我的理解,Express req.ip
是一种更好的方法req.connection.remoteAddress
,因为req.ip
包含实际的客户端ip(假设在Express中启用了可信代理),而另一个可能包含代理的IP地址(如果有的话)一).
这就是为什么目前接受的答案表明:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
这req.headers['x-forwarded-for']
将相当于快递req.ip
.
Hon*_*iao 22
如果您可以使用 3rd-party 库。您可以检查request-ip。
你可以使用它
import requestIp from 'request-ip';
app.use(requestIp.mw())
app.use((req, res) => {
const ip = req.clientIp;
});
Run Code Online (Sandbox Code Playgroud)
源码比较长,这里就不复制了,大家可以查看https://github.com/pbojinov/request-ip/blob/master/src/index.js
基本上,
它在请求中查找特定的标头,如果它们不存在,则回退到某些默认值。
用户ip由以下顺序确定:
X-Client-IP
X-Forwarded-For
(Header可能会返回多个IP地址,格式为:“客户端IP,代理1 IP,代理2 IP”,所以我们取第一个。)CF-Connecting-IP
(Cloudflare)Fastly-Client-Ip
(当转发到云功能时,快速 CDN 和 Firebase 托管标头)True-Client-Ip
(Akamai 和 Cloudflare)X-Real-IP
(Nginx 代理/FastCGI)X-Cluster-Client-IP
(Rackspace LB、Riverbed Stingray)X-Forwarded
,Forwarded-For
和Forwarded
(#2 的变体)req.connection.remoteAddress
req.socket.remoteAddress
req.connection.socket.remoteAddress
req.info.remoteAddress
如果找不到 IP 地址,它将返回
null
。
披露:我与图书馆无关。
lea*_*ore 10
这只是此答案的附加信息。
如果您正在使用nginx
,您将添加proxy_set_header X-Real-IP $remote_addr;
到站点的位置块。/etc/nginx/sites-available/www.example.com
例如。这是一个示例服务器块。
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.1.1:3080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Run Code Online (Sandbox Code Playgroud)
重新启动后nginx
,您将能够访问node
/express
应用程序路由中的 IPreq.headers['x-real-ip'] || req.connection.remoteAddress;
app.set('trust proxy', true)
req.ip
或req.ips
按常规方式小智 6
我为此编写了一个包。您可以将其用作快速中间件。我的包在这里发布:https : //www.npmjs.com/package/express-ip
您可以使用安装模块
npm i express-ip
Run Code Online (Sandbox Code Playgroud)
用法
const express = require('express');
const app = express();
const expressip = require('express-ip');
app.use(expressip().getIpInfoMiddleware);
app.get('/', function (req, res) {
console.log(req.ipInfo);
});
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这个问题已经得到回答,但这是我如何让我的工作。
let ip = req.connection.remoteAddress.split(`:`).pop();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
226460 次 |
最近记录: |