我该如何在控制器中确定给定请求的IP地址?例如(在express中):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
对我来说,使用 Kubernetes Ingress (NGINX):
req.headers['x-original-forwarded-for']
在Node.js中运行得非常好
我使用这个格式来表示IPv4地址
req.connection.remoteAddress.split(':').slice(-1)[0]
您可以使用Express这样获取用户IP地址:
req.ip
例如,在此示例中,我们获取用户的IP地址,并使用req.ip将其发送回用户。
app.get('/', (req, res)=> {
res.send({ ip : req.ip})
})
req.ip
may also include an IPv4 subnet prefix ::ffff:
- as explained in this answer. easy to filter out --> req.ip.toString().replace('::ffff:', '');
- neonwattyconst getRequestIpAddress = (request) => {
const requestIpAddress = request.request.headers['X-Forwarded-For'] || request.request.connection.remoteAddress
if (!requestIpAddress) return null
const ipv4 = new RegExp("(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
const [ipAddress] = requestIpAddress.match(ipv4)
return ipAddress
}
req.headers.origin
对我很有用
req.headers.orgin
返回的是客户端浏览器应用程序指向的 IP 地址,而不是客户端本身的 IP。 - zipzitconst ip = req.ip?.replace(/^.*:/, '') //->192.168.0.101
或者
const ip_raw = req.headers['x-forwarded-for'] ||
req.socket.remoteAddress ||
null; //->:ffff:192.168.0.101
const ip = ip_raw?.replace(/^.*:/, '')//->192.168.0.101
note: req.ip?.replace(/^.*:/, '')
^ ^
null secure regular expressin
(if ip=!null continue to apply a regular expression)
server {
listen 443 ssl;
server_name <your-domain>;
ssl_certificate /etc/letsencrypt/live/<your-domain>/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/<your-domain>/privkey.pem; # managed by Certbot
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; # THIS LINE !!!!
}
}
curl https://api.ipify.org
。curl
是一个从网站获取数据的应用程序,我们将网站"https://api.ipify.org"作为参数传递。我们可以使用node-fetch
来替换curl
!const fetch = require('node-fetch');
fetch('https://api.ipify.org')
.then(response => {/* whatever */})
.catch(err => {/* whatever */})
// Extract Client IP Address
app.use((req, res, next) => {
let ipAddress = (req.headers['x-forwarded-for'] as string || '').split(',')[0]
if (!validator.isIP(ipAddress))
ipAddress = req.socket.remoteAddress?.toString().split(':').pop() || ''
if (!validator.isIP(ipAddress))
return res.status(400).json({errorMessage: 'Bad Request'})
req.headers['x-forwarded-for'] = ipAddress
next()
})
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
var ip = req.ip
console.log(ip);
res.send('Hello World!')
})
// Run as nodejs ip.js
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
req.ip
。 - FrickeFreshlocalhost
工作的人,下面所有答案的结果几乎都会出现::1
。这让我困惑了一段时间。后来发现::1
是真正的IP地址,是本地主机的IPV6
表示法。希望这能帮助到某些人。 - Pramesh Bajracharyareq.headers['cf-connecting-ip']
- Muhammad Shahzad