文章目录
好多项目用到 前后端分离 结构,那这个时候就会涉及到反向代理的问题,OK ,那么在实际应用中,laravel 是如何获取用户真实的IP 地址呢? 下面就跟我一块来了解一下吧!!!
Apache (测试能够使用)
1. 激活加载remoteip模块
remoteip模块用于处理useragent,已识别的客户端,将请求作为实际客户端地址发起,而不是Apache可能正在接收的可能的负载均衡器,代理或其他前端服务器地址。
这意味着您的Apache Web服务器将覆盖它作为原始使用者接收的客户端IP地址,
激活
# a2enmod remoteip
开启remoteip 模块
vim apache2.conf
去掉 #
LoadModule remoteip_module modules/mod_remoteip.so
2. 定义代理与服务
编辑要修改的web 应用配置
<VirtualHost *:80>
ServerAdmin xxxx
DocumentRoot "xxxxxx"
ServerName xxxxx.com
ErrorLog "logs/dev.com-error.log"
CustomLog "logs/dev.com-access.log" common
ProxyRequests Off
ProxyPass /api http://api.xxx.com/api
ProxyPassReverse /api http://api.xxx.com/api
RemoteIPHeader X-Forwarded-For # 添加的内容
RemoteIPTrustedProxy 192.168.1.10 # 添加的内容
</VirtualHost>
其中,
- 添加任意数量的代理定义,以便在使用多个服务或负载平衡器时为来自这些代理的流量配置XFF标头的使用。添加多个代理的示例
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 192.168.1.10 10.10.0.1
- 请注意,如果最终用户在内部网络中具有IP,则上面使用的RemoteIPTrustedProxy将不起作用。要接受内部网络IP(如果它符合您的环境需求),您还需要使用以下命令在配置文件中定义代理:
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 192.168.1.10
3. 配置Apache日志格式以使用X-Forwarded-For
# vim apache2.conf
在文件中搜索LogFormat行。Apache的标准日志记录格式如下所示,您可能会在文件中看到类似的内容。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combined
此格式使用%h
字段捕获标头,默认情况下,我们将在示例中使用代理地址。由于我们希望在日志记录中使用原始客户端IP地址,因此您必须将LogFormat定义修改为如下所示:
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
请注意我们如何用字段%a
替换原始标题字段位置(%h
)。这是X-Forwarded-For
字段,负责显示正确的始发客户端IP地址。只要您具有日志记录格式定义,请将%h替换为%a
以使用X-Forwarded-For
。
Apache具有高度可配置性,您可以通过播放XFF标头字段的位置,进一步修改日志格式,直到它最适合您的格局和Web应用程序。如果对最终格式感到满意,请保存并退出文件。接下来,您需要重新加载Apache才能使更改生效。
在重新加载服务器之前,您可以使用Apache命令apache2ctl验证配置中是否有错误:
# apache2ctl configtest
如果上一步没有输出错误,您可以安全地重新加载到新配置以开始使用XFF。使用service命令重新启动Apache Web服务器:
# service apache2 restart
4. 结论
一旦您的Apache Web服务器重新启动,它将开始记录正确的客户IP地址信息,而不是您可能在您的环境中使用的任何中间人服务。您可以轻松地知道,如果您使用代理或其他类似服务,您的客户信息数据将100%保留。如果您发现它有用,请与您的朋友分享本教程!
5. 参考链接
Apache remoteip 模块 说明
如何在Apache Web Server中获取X-Forwarded-For IP地址