nginx内部设置的头不会出现在PHP的$_SERVER变量中,而是出现在Laravel的request()函数中

ffscu2ro  于 5个月前  发布在  PHP
关注(0)|答案(1)|浏览(54)

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()函数有?
先谢了。

gtlvzcf8

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

相关问题