使用 nginx 作为反向代理的 $_SERVER 中的 HTTPS 变量

使用 nginx 作为反向代理的 $_SERVER 中的 HTTPS 变量

我在带有 mod_php 的 apache 前面使用 nginx 作为反向代理。我的网站使用 https,需要将变量 $_SERVER['HTTPS'] 设置为“on”才能正确组装某些链接。我的网站使用 drupal,因此在确定网站是否在 https 下运行时,修复代码并检查其他变量不是一个选择。

有没有办法仅通过调整 nginx 或 apache 配置来解决这个问题?

我发现其他人也问了类似的问题,但我没有找到适合我的解决方案,也没有明确说明我想要的是不可能的。

(例如:HTTPS 服务器/php 变量不可用Nginx:在 HTTP 上删除标头,在 HTTPS 上添加标头

答案1

您可以在 Apache 主配置或 .htaccess 中使用指令SetEnv HTTPS "on"将所需变量无条件设置为开启。

或者更好的是 - 仅当客户端地址等于 Nginx 前端的地址时才设置它。在这种情况下,如果客户端不使用 SSL 直接请求 Apache,则不会设置该变量:

SetEnvIf Remote_Addr "NGINX_IP_ADDRESS" HTTPS=on

答案2

还值得注意的是:没有什么可以阻止您(并且 Securepages 模块文档甚至在某些情况下建议这样做)编辑您的内容settings.php以包含这样的块:

$headers = @apache_request_headers();
$real_client_ip  = ($headers === NULL ? $_SERVER['HTTP_X-Forwarded-For'] : $headers["X-Forwarded-For"] );
if ( $real_client_ip == '1.2.3.4' ) {
    $_SERVER['HTTPS'] = 'on';
}

也就是说,更好的(通常更安全的)选择是通过传递环境变量等带外方法来实现。

相关内容