我已经配置了apache(版本2.4)反向代理,以在我们的网站上发布安装在内部服务器中的应用程序。一切正常,这些是我在proxy-html.conf中添加的行:
ProxyPass /app/bpv0SOCPOkqptPqO6XsIvucLzO7QXJyA/ http://srvacg:9081/acgv4/
如果我写这个网址http://www.mysite.com/app/bpv0SOCPOkqptPqO6XsIvucLzO7QXJyA/我可以登录我的内部应用程序,我可以使用它。
问题是我的应用程序检查客户端的IP地址,并且只允许同一个ip连接1次。使用反向代理配置所有连接都是使用安装了apache的服务器的私有IP完成的。
我尝试使用mod_remoteip来解决这个问题:
RemoteIPHeader X-Forwarded-For
但结果总是一样的。这是apache访问日志:
REMOTE-IP: %a - LOCAL-IP: %A | X-Forwarded-For: %{X-Forwarded-For}i | h: %h | UNDERLYING CLIENT IP: %{c}a |
REMOTE-IP: 217.57.XXX.XXX - LOCAL-IP: 192.168.89.3 | X-Forwarded-For: 217.57.XXX.XXX | h: 217.57.XXX.XXX | UNDERLYING CLIENT IP: 217.57.XXX.XXX |
217.57.XXX.XXX是客户端IP,192.168.89.3是内部ip,是我的应用程序收到的ip。我无法知道它是如何得到这些信息的。
有人能帮助我吗?
答案 0 :(得分:1)
如果你不能根据你的要求修改那个应用程序,那么也许你可以包装它?
如果您可以安装一个额外的应用程序,一个简单的包装器,只需一个简单的脚本,您就可以构建一个解决方法:配置代理服务器以将所有请求转发给该包装器而不是“真正的”内部应用程序。然后,包装器可以代表代理服务器发出内部请求,以代理(或客户端)完成的方式请求“真实”应用程序并转发回复。优点:您可能能够构建一个看起来源自原始远程客户端ip的请求,包装器可以将其视为代理服务器添加的附加头。由于从包装器到“真实”应用程序的请求是系统内部的,因此没有包通过网络移动,因此防火墙不能阻止任何包。
我没试过这个,但这可能是一种解决方法......
答案 1 :(得分:0)
由于某些原因, mod_remoteip 对我的实施无效。
相反,正如在 Apache 2.4 上测试的那样,我发现这有效。
对于 httpd.conf ,请尝试搜索< IfModule log_config_module> 所在的部分,并将CustomLog语句替换为:
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
CustomLog "logs/access.log" proxy
LogFormat 语句创建一个名为proxy的自定义日志格式,该格式利用代理转发的环境变量 X-Forwarded-For 作为远程IP地址的源真实的客户。
CustomLog 语句只是使用自定义日志格式“proxy”将结果写入“access.log”,而现在显示真实的IP地址。