【问题标题】:PHP is always returning the same IPPHP 总是返回相同的 IP
【发布时间】:2019-10-04 09:22:09
【问题描述】:

我一直在使用以下 PHP 代码记录 IP:

getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('REMOTE_ADDR')

它一直运行良好。但是从今年 5 月开始,我注意到所有记录的 IP 都是 74.220.219.56。我还通过使用VPN和更改国家对其进行了测试,但问题仍然存在。现在我只需要使用getenv('REMOTE_ADDR') 才能获得正确的IP。

这可能是我的托管公司的设置造成的吗?

【问题讨论】:

  • 好像是代理服务器问题

标签: php ip-address


【解决方案1】:

HTTP_CLIENT_IPHTTP_X_FORWARDED_FOR 都是非标准的 HTTP 标头,必须由代理服务器设置。如果您的托管公司在您的 PHP 应用程序前面有一个代理,他们需要启用这些标头才能使其正常工作。

此外,如果您绝对确定您的托管服务提供商使用它们,您应该只阅读 IP 的这些标头中的任何一个。如果您不确定,这可能是一个安全问题。

简而言之,这些标头中的任何一个是否有效完全取决于您的托管商,并且在您确定您的托管商是否支持它们之前,您不应使用这些标头。

【讨论】:

  • 谢谢。我会向我的托管公司查询详情。
【解决方案2】:

如果您正在使用 PHP 网络应用程序,那么您将能够通过超级全局服务器变量检查用户 IP。

$ip = $_SERVER["REMOTE_ADDR"];

如果您在 $_SERVER 变量上调用 print_r 函数,您将看到有关服务器的相关信息。这是本地服务器(wamp)

Array
(
    [HTTP_HOST] => localhost:8080
    [HTTP_CONNECTION] => keep-alive
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, br
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.9
    [HTTP_COOKIE] => PHPSESSID=f1m56d9il08q2no5trdvdb4us1; _ga=GA1.1.1485216858.1538653842; user_ip=%3A%3A1; th_active_theme=USD; wordpress_test_cookie=WP+Cookie+check
    [PATH] => C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn\;C:\wamp64\bin\php\php5.6.25;C:\Program Files\Git\cmd;C:\WINDOWS\System32\OpenSSH\;C:\composer;C:\Program Files\PuTTY\;C:\Program Files\nodejs\;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps
    [SystemRoot] => C:\WINDOWS
    [COMSPEC] => C:\WINDOWS\system32\cmd.exe
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [WINDIR] => C:\WINDOWS
    [SERVER_SIGNATURE] => 
Apache/2.4.23 (Win64) PHP/7.0.10 Server at localhost Port 8080


    [SERVER_SOFTWARE] => Apache/2.4.23 (Win64) PHP/7.0.10
    [SERVER_NAME] => localhost
    [SERVER_ADDR] => ::1
    [SERVER_PORT] => 8080
    [REMOTE_ADDR] => ::1
    [DOCUMENT_ROOT] => C:/wamp64/www
    [REQUEST_SCHEME] => http
    [CONTEXT_PREFIX] => 
    [CONTEXT_DOCUMENT_ROOT] => C:/wamp64/www
    [SERVER_ADMIN] => wampserver@wampserver.invalid
    [SCRIPT_FILENAME] => C:/wamp64/www/test/index.php
    [REMOTE_PORT] => 60364
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /test/
    [SCRIPT_NAME] => /test/index.php
    [PHP_SELF] => /test/index.php
    [REQUEST_TIME_FLOAT] => 1558071651.052
    [REQUEST_TIME] => 1558071651
)

【讨论】:

  • 感谢您的信息。这个方法好像和getenv('REMOTE_ADDR')一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2014-05-01
  • 2017-07-04
  • 2019-10-22
相关资源
最近更新 更多