Docker上有一个Laravel应用程序。它有php-fpm和nginx容器。当我从nginx向外部服务器发布HTTP请求时,外部服务器将客户端的IP地址识别为nginx容器的IP,而不是主机的IP地址。
为了解决这个问题,我想在nginx容器中添加一个自定义头,它可以像这样确定地址的IP
add_header X-SERVER-REAL-IP "1.2.3.4";
字符串
然后在后端应用程序中,我检查以下内容
if(isset($_SERVER['X-SERVER-REAL-IP']))
{
$_SERVER['REMOTE_ADDR'] = $_SERVER['X-SERVER-REAL-IP'];
}
型
问题是,超级全局变量$_SERVER
没有键X-SERVER-REAL-IP
,而Laravel应用程序控制器中的request()
函数有这个键,这让我很惊讶。现在我的问题是:
1.我是否正在执行设置服务器的真实的IP地址的最佳实践?
1.为什么$_SERVER
没有X-SERVER-REAL-IP
键,而Laravel的request()
函数有?
先谢了。
1条答案
按热度按时间gtlvzcf81#
PHP documentation for
$_SERVER
说道:除了下面列出的元素之外,PHP还会从请求头中创建其他元素。这些元素将被命名为
HTTP_
,后跟头名称,大写,并带有下划线而不是连字符。例如,Accept-Language
头将作为$_SERVER['HTTP_ACCEPT_LANGUAGE']
提供。这意味着
X-SERVER-REAL-IP
将变成$_SERVER['HTTP_X_SERVER_REAL_IP']
。但是如果你使用的是像Laravel这样的框架,它有自己的方式来访问头和其他请求数据,那么使用它而不是像$_SERVER
这样的低级PHP方式通常是一个好主意。然而,请注意,Nginx配置中的
add_header
不会像您在这里期望的那样,因为它添加了响应头,而这些对处理请求的PHP代码是不可见的。将数据从Nginx传递到PHP代码取决于您如何运行PHP,例如通过Nginx的mod_fastcgi
使用PHP-FPM,您可以使用fastcgi_param
直接将数据传递到$_SERVER
。