怎样才能得到nginx做反向代理时的真实IP?
nginx在转发的时候可以通过添加特定的头来显示原始IP地址 通常使用X-Forwarded-For或CLIENT_IP来表示原始IP地址 IP地址都是以逗号来追加IP地址 所以取该请求头的第一个值,一般就是原始的IP地址。
测试程序代码(后续测试基于它):
// g++ -g -o hello.cgi hello.cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Content-Type: text/html; charset=utf-8\r\n\r\n");printf("<p>HTTP_X_FORWARDED_FOR: %s\n", getenv("HTTP_X_FORWARDED_FOR"));printf("<p>HTTP_X_REAL_IP: %s\n", getenv("HTTP_X_REAL_IP"));printf("<p>REMOTE_ADDR: %s\n", getenv("REMOTE_ADDR"));printf("<p>");
return 0;
}
测试是在nginx自带配置文件nginx.conf上进行的修改:
proxy_set_header可以添加在nginx.conf的http段,也可以是server段,还可以是location段,一级一级间是继承和覆盖关系。
如果正确编译和配置了nginx反向代理,当只有一层nginx反向代理时,可以通过“HTTP_X_REAL_IP”取得client的真实IP。
如果有二层nginx反向代理,则client的真实IP被包含在“HTTP_X_FORWARDED_FOR”中。
最不可信的是“REMOTE_ADDR”,它的内容完全可以被client指定!总之只要编译和配置正确,“HTTP_X_FORWARDED_FOR”总是包含了client的真实IP。