Getting IP address and location of my own server instead of visiting user's

17,797

Solution 1

Here's the Nginx Conf which works for me, placed at the path /etc/nginx/conf.d/example.com.conf.

server {
    listen 80;
    listen [::]:80;
    server_name example.com;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass "http://localhost:1234/";
    }
}

No other Nginx Conf required, as of my previous implementation i was having another conf file at the /etc/nginx/sites-available/default directory which was conflicting as a Duplicate Server Name. Lastly, i would like to add that use Nginx Testing command before resetting the changes. Which was a huge help. Command: nginx -t.

And in Node.js, this is the most appropriate way to access Client's IP Address.

var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0] 
                       || req.connection.remoteAddress;
console.log(getClientAddress);

Cheers ;-)

Solution 2

Because your main application server is behind a proxy server, you will naturally be seeing the IP address of the proxy server, since this is effectively the "client" making the request to your application server.

You need the IP address of the client that makes the request to the proxy server - the originating IP address. The only way to get this information is if the proxy server passes on the IP address that made the request. Proxy servers commonly do this with the X-Forwarded-For HTTP request header.

X-Forwarded-For: <client-ip-address>

However, this header can contain multiple IP addresses (comma separated) if multiple proxy servers have been passed through:

X-Forwarded-For: <client-ip-address>, <previous-proxy-ip>
Share:
17,797

Related videos on Youtube

Dynamic Remo
Author by

Dynamic Remo

Updated on September 18, 2022

Comments

  • Dynamic Remo
    Dynamic Remo almost 2 years

    I have a MEAN Stack application deployed on a server and am using Nginx as proxy server to handle the request and redirect to application's particular port.

    For example: User accesses the URL http://www.example.com/ and Nginx hits the actual application URL http://www.example.com:1234/, as my application is running on port 1234.

    Now, for analytics purpose I wrote a short script in node.js which fetches IP and location of the users visiting my website. I can see the externally searched queries but I am getting the IP address and location of my own server. Why is that?

    Is that because of Nginx? How can I resolve this and fetch the user's actual location?

  • DisgruntledGoat
    DisgruntledGoat about 7 years
    In your node.js code you need to ensure the request has been passed from your own server. Otherwise, someone can connect to your app on port 1234 directly and spoof any IP address using x-forwarded-for.
  • Dynamic Remo
    Dynamic Remo about 7 years
    To ensure that, do we need to listen like this? let server = app.listen("1234", 127.0.0.1 , calback); right? or how can we do that?