我收到通知:未定义索引:HTTP_X_FORWARDED_FOR在下面的函数中:
function _ip( )
{
return ( preg_match( "/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] );
}
答案 0 :(得分:15)
您应该使用getenv()方法而不是$ _SERVER。
function _ip( )
{
if (preg_match( "/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", getenv('HTTP_X_FORWARDED_FOR'))
{
return getenv('HTTP_X_FORWARDED_FOR');
}
return getenv('REMOTE_ADDR');
}
另外,我会坚持使用$ip = getenv('REMOTE_ADDR')
,因为垃圾邮件发送者可以将HTTP_X_FORWARDED_FOR
标题设置为他们想要的任何内容,而无法更改remote_addr。问题是“好的”代理人会说出HTTP_X_FORWARDED_FOR
的真相,所以你会错过这个。
答案 1 :(得分:3)
$ _ SERVER ['HTTP_X_FORWARDED_FOR']在您的数组中不存在。您可以使用print_r($_SERVER)
进行确认。在使用之前,您需要测试该数组索引是否存在。
function _ip( )
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return ( preg_match( "/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] );
} else {
return null; //something else
}
}
答案 2 :(得分:1)
没有“标题存在。在访问之前,您需要检查它是否存在。
function _ip( )
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) {
if (preg_match( "/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR'])
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
}
return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
}
答案 3 :(得分:0)
显然这是因为$ _SERVER数组中不存在该索引。你可以通过
来避免通知if( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) {
// your code here
} else {
if( isset( $_SERVER['REMOTE_ADDR'] ) )
return $_SERVER['REMOTE_ADDR'];
else
return FALSE;
}
我猜你正试图检索远程地址,上面的代码可能会更健壮。
答案 4 :(得分:0)
getenv('HTTP_X_FORWARDED_FOR')如果$ _SERVER数组中不存在该变量,则返回false;而如果未设置该变量,则$ _SERVER ['HTTP_X_FORWARDED_FOR']返回未定义的索引。