What does “trust proxy” actually do in express.js, and do I need to use it?

后端 未结 2 1571
逝去的感伤
逝去的感伤 2021-01-30 06:26

I am writing an express app that sits behind an nginx server. I was reading through express\'s documentation and it mentioned the \'trust proxy\' setting. All it says is

<
2条回答
  •  既然无缘
    2021-01-30 07:15

    Annotated code to explain use of trust proxy

        var express = require('express');
    
        var app = express();
    
        // Set the ip-address of your trusted reverse proxy server such as 
        // haproxy or Apache mod proxy or nginx configured as proxy or others.
        // The proxy server should insert the ip address of the remote client
        // through request header 'X-Forwarded-For' as
        // 'X-Forwarded-For: some.client.ip.address'
        // Insertion of the forward header is an option on most proxy software
        app.set('trust proxy', '127.0.0.1');
    
    
        app.get('/test', function(req, res){
          var ip = req.ip; // trust proxy sets ip to the remote client (not to the ip of the last reverse proxy server)
          if (ip.substr(0,7) == '::ffff:') { // fix for if you have both ipv4 and ipv6
            ip = ip.substr(7);
          }
          // req.ip and req.protocol are now set to ip and protocol of the client, not the ip and protocol of the reverse proxy server
          // req.headers['x-forwarded-for'] is not changed
          // req.headers['x-forwarded-for'] contains more than 1 forwarder when
          // there are more forwarders between the client and nodejs.
          // Forwarders can also be spoofed by the client, but 
          // app.set('trust proxy') selects the correct client ip from the list
          // if the nodejs server is called directly, bypassing the trusted proxies,
          // then 'trust proxy' ignores x-forwarded-for headers and
          // sets req.ip to the remote client ip address
    
          res.json({"ip": ip, "protocol": req.protocol, "headers": req.headers['x-forwarded-for']});
        });
    
    // in this example the reverse proxy is expected to forward to port 3110
    var port = 3110;
    app.listen(port);
    // test through proxy: http://yourproxyserver/test, req.ip should be your client ip
    // test direct connection: http://yournodeserver:3110/test, req.ip should be your client ip even if you insert bogus x-forwarded-for request headers
    console.log('Listening at http://localhost:' + port);
    

提交回复
热议问题