这是我的 vcl 配置文件中与 IP 转发相关的部分:
sub vcl_recv {
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;
.... (other configuration)
}
sub vcl_pipe {
set req.http.connection = "close";
if (req.http.X-Forwarded-For) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
} else {
set req.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
}
}
sub vcl_pass {
set req.http.connection = "close";
if (req.http.X-Forwarded-For) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
} else {
set req.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
}
}
我已经安装了mod_rpaf,httpd.conf上的相关配置设置为:
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.0.0.1 67.23.31.16
RPAFheader X-Forwarded-For
现在,我尝试使用$_SERVER["HTTP_X_FORWARDED_FOR"]
php 内部来获取 IP 地址。第一次使用时成功,然后开始一片空白。同样,如果我过一会儿再尝试,比如说一分钟后,我又可以第一次获取到 IP 地址。
因此,基本上它不能持续工作或随机工作,或者准确地说,只能工作一次,并且不能再工作一段时间,然后又只能工作一次。非常奇怪。我感觉有些配置不正确。我花了相当多的时间在谷歌上搜索。到处都有人建议添加x-forward-for
和安装 mod_rpaf 模块。如您所见,我正是这么做的。
任何帮助将不胜感激。
答案1
如果你只在接收函数子程序。请参阅此Varnish 流程图不同的子程序将如何处理请求。
您已将“RPAFsethostname”设置为“On”。据我所知,这是为了使用 X-Host 标头而不是 Host 标头。请检查您的 Varnish 设置是否需要这样做。通常不会使用/设置 X-Host 标头。
无论如何,使用 mod_rpaf 的想法是将 Apache 的 REMOTE_ADDR 值替换为 X-Forwarded-For 值。因此您不必更改脚本、基于 IP 的身份验证或日志记录。对于您的 PHP 脚本,我建议使用 $_SERVER['REMOTE_ADDR']。
如果这不能解决您的问题,请停用 mod_rpaf 模块。除了使用 $_SERVER['REMOTE_ADDR']、基于 IP 的身份验证或日志记录的脚本之外,其他一切都应该可以正常工作。如果问题没有解决,则您的 Varnish/Apache 设置中的其他某些东西无法组合在一起。