drupal-7 - 如何让drupal看到nginx反向代理->清漆->Apache堆栈后面的客户端IP?
问题描述
我使用 nginx 作为反向代理来处理端口 80 -> 443 重定向,然后到与服务于 drupal (7.69) 站点的 Apache2.4 后端(端口 8182)对话的清漆缓存(端口 8181)。
我已将 nginx 配置为将客户端 IP 转发为:
proxy_pass http://127.0.0.1:8181;
proxy_read_timeout 90;
proxy_connect_timeout 90;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-Host $remote_addr;
proxy_set_header Host $host;
在清漆 vcl_recv 我添加:
if (req.restarts == 0) {
if (req.http.X-Forwarded-For) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
在 apache 中,我安装了 remoteip 模块并设置了以下配置:
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1
在drupal的settings.php中我有
$conf['reverse_proxy'] = True;
$conf['reverse_proxy_header'] = 'X-Forwarded-For';
$conf['reverse_proxy_addresses'] = array('127.0.0.1');
...但是 drupal 似乎仍然只看到和登录 localhost (127.0.0.1) ip,而不是真正的客户端 IP。因此,表单被记录为不是来自真实用户而是服务器本身提交的。
我想知道我的清漆配置是否关闭,因为我也在从 nginx 代理并绕过清漆直接进入绕过drupal(它是SMF)但在相同的apache配置上运行的论坛;论坛正在记录从 nginx 发送的客户端 IP(使用相同的标头更改和 apache remoteip 配置)就好了。
我将不胜感激指导/建议。
解决方案
漆
理论上,您的 Varnish 配置X-Forwarded-For
是正确的。
实际上,您甚至不需要X-Forwarded-For
在 Varnish 中进行设置,因为 Varnish 会自动执行此操作。
Drupal 配置
就 Drupal 配置而言,它可能与reverse_proxy_header
. 我偶然发现了这段 Drupal 7 文档:https ://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/ip_address/7.x 。
该页面上代码的关键部分如下:
$reverse_proxy_header = variable_get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR');
显然,ip_address()
可以X-Forwarded-For
通过配置参数使此功能知道标头。
但是,标头格式不是官方的 HTTP 格式,而是 PHP$_SERVER
超全局存储它的方式。在这种情况下,格式为HTTP_X_FORWARDED_FOR
.
所以请尝试$conf['reverse_proxy_header'] = 'X-Forwarded-For';
用$conf['reverse_proxy_header'] = 'HTTP_X_FORWARDED_FOR';
.
推荐阅读
- scala - 对于理解返回类型
- django - 使用 Django-rest-auth 创建新用户时创建自定义用户模型
- java - 使用函数为 Get 和 Post 请求创建通用类的最简单方法?
- javascript - 使用 jmeter 在 selenium 中执行 java 脚本时方法调用出错
- python - 如何在 Ubuntu 17.10 上为 anaconda 创建桌面条目?
- javascript - 时刻列中的触发函数在GridX中排序
- json - 如何转义字符串中的字符(JSON 格式)
- c# - 如何在 razor 中使用 ajax 更新下拉列表
- racket - 如何在球拍中创建新语言?
- html - 如何从 Nodejs 获取数据到 Angular 6?