sunilsmith
sunilsmith

Reputation: 111

get client ip address in request hapijs for node

I need to get the ip address of client using my application in the request of hapijs node... we are using pm2 and Nginx for server to run live and we have used the request.info.address but it gives the server local ip as 127.0.0.1 but what i need was the client's IP who uses my application eg: 192.x.x.111 ...

Upvotes: 3

Views: 5355

Answers (4)

luismatute
luismatute

Reputation: 191

You should check the configuration on the reverse proxy (nginx) and see if you are sending the ip and how you're doing it.

For example (nginx conf):

server {
    listen       0.0.0.0:80;
    server_name  [your_domain];
    root /webroot/[your_domain or webapp name];
    access_log  /var/log/nginx/[your_domain or webapp name].log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:[port assigned to node];
        proxy_redirect off;
    }
}

In this case, you will get the client's IP via the header X-Real-IP.

So in HapiJS, where you have access to the request object:

const ip = request.headers['x-real-ip'] || request.info.remoteAddress;

Upvotes: 4

Marcus Poehls
Marcus Poehls

Reputation: 461

I'm running the same stack for my hapi apps with nginx and PM2. Proxying requests through nginx to a node app on the same host will always result in 127.0.0.1 for the remote address, because nginx forwards the request on the same host.

Solution: there's a dedicated plugin hapi-geo-locate that determines the actual client IP address even though you're running your app behind a reverse proxy (like nginx).

hapi-geo-locate supports various proxies and HTTP headers, so you should be save and get the user's IP running your app on different platforms.

Hope that helps!

Upvotes: 1

Partinder Singh
Partinder Singh

Reputation: 221

In case if you are running the server behind a Nginx proxy server you would have to use

    req.headers['x-real-ip']

else you can use

req.info.remoteAddress

Upvotes: 4

Sparw
Sparw

Reputation: 2743

I always get client IP address with this function :)

    return request.headers['x-forwarded-for'] ||
    request.connection.remoteAddress ||
    request.socket.remoteAddress ||
    request.connection.socket.remoteAddress;

Hope it helps.

Upvotes: 2

Related Questions