取得訪問者的機器名稱,管制該機器能使用的功能
一般方式取得 client ip
碰到一個需求是要知道訪問者的機器,做後續相關的事情 (例如針對該電腦操作”列表機”之類的機器)
目前得知以下可以取得訪問者的 ip
1 | request.connection.remoteAddress; // ::ffff:192.xxx.xxx.xxx (客戶端ip) |
node.js 在啟動時,.listen(port)
沒有特別設置的話默認會是 ipv6
,取得的 ip 會長::ffff:192.xxx.xxx.xx
要達到想到的效果,要將.listen(port, '0.0.0.0')
,就可以取到 ipv4
,雖然取得 ipv6
也是可以用表達是過濾掉 ::ffff:
1 | request.connection.remoteAddress.replace(/^.*:/, ""); // ::ffff:192.xxx.xxx.xxx >>> 192.xxx.xxx.xxx |
涉及代理情況下取得 client ip
server 假如是有代理(proxy)
的話,就要用以下方式抓出 ip
這方式可能會取得多個 ip,因為 X-Forwarded-For: OriginatingClientIPAddress, proxy1-IPAddress, proxy2-IPAddress
最左邊是原始客戶端,並且每個通過請求的後續代理會將 ip 添加到接收請求的位置。
以上的例子通過了 proxy1 再來是 proxy2。proxy2 是請求的遠程位置。
1 | // X-Forwarded-For - The IP address of the client before it went through the proxy |
建議取得 client ip 的方式
Arnav Gupta 提出的取得方式
1 | var ip = |
相關文件 node.js API: net.module - server.listen
取得客戶端機器名稱
取得 ip 之後,就可以用 node 的 dns module 找出機器名稱。
1 | require('dns').reverse(req.connection.remoteAddress, function(err, domains) { |
相關文件 dns.reverse
參考
How to retrieve client and server IP address and port number in Node.js
Stripping “::ffff:” prefix from request.connection.remoteAddress nodejs
How to determine a user’s IP address in node