我在带有 mod_php 的 apache 前面使用 nginx 作为反向代理。我的网站使用 https,需要将变量 $_SERVER['HTTPS'] 设置为“on”才能正确组装某些链接。我的网站使用 drupal,因此在确定网站是否在 https 下运行时,修复代码并检查其他变量不是一个选择。
有没有办法仅通过调整 nginx 或 apache 配置来解决这个问题?
我发现其他人也问了类似的问题,但我没有找到适合我的解决方案,也没有明确说明我想要的是不可能的。
答案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';
}
也就是说,更好的(通常更安全的)选择是通过传递环境变量等带外方法来实现。