nginx + express 获取用户ip
nginx 配置
location / { proxy_pass http://127.0.0.1:3000; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true;}复制代码
express 代码片段
var express = require('express')var app = express()app.get('/', function(req, res) { // 获取ip var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; console.log(ip) res.send(ip)})app.listen(3000, function() { console.log('Server is running in 3000')})复制代码
demo 地址:
原生javascript获取用户ip
存在兼容性问题(不稳定)
function getUserIp(onNewIP) { // campatibility for firefox and chrome var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var pc = new myPeerConnection({ iceServers: [] }), noop = function() {}, localIPs = {}, ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g, key; function iterateIP(ip) { if (!localIPs[ip]) onNewIP(ip); localIPs[ip] = true; } // create a bogus data channel pc.createDataChannel(""); // create offer and set local description pc.createOffer().then(function(sdp) { sdp.sdp.split('\n').forEach(function(line) { if (line.indexOf('candidate') < 0) return; line.match(ipRegex).forEach(iterateIP); }); pc.setLocalDescription(sdp, noop, noop); }).catch(function(reason) { // An error occurred, so handle the failure to connect }); // listen for candidate events pc.onicecandidate = function(ice) { if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return; ice.candidate.candidate.match(ipRegex).forEach(iterateIP); }}// ipgetUserIp(function(ip) { console.log('ip', ip);});复制代码
第三方接口获取用户ip
function getIp() { return new Promise((resolve, reject) => { var script = document.createElement('script') // script.src = 'https://jsonip.com/' script.src = 'http://pv.sohu.com/cityjson?ie=utf-8' script.onload = function() { resolve(window.returnCitySN) } document.body.appendChild(script) })}复制代码