公众号--当使用反向代理后php中$_SERVER[HTTP_HOST]方法获取的host有问题

案例重现:
当集成jssdk时,生成签名signature参数环节需要涉及到获取当前有效URL地址的操作,如下wx.config:

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

signature生成方法:

公众号--当使用反向代理后php中$_SERVER[HTTP_HOST]方法获取的host有问题_第1张图片
signature生成方法

继续......
由于在微信管理后台所设置的‘JS接口安全域名’使用了反向代理(因为这个域名备案了 所以使用反向代理到另一个没有备案的服务器B-server ,B-server就是代码部署的服务器]);

重点来了......
在使用php获取当前网址时,网上大多都给了这样一段代码:

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

今天我要说的是 $_SERVER[HTTP_HOST] 这个东西,当使用了反向代理时,它获取到的host是代码部署服务器的ip地址而不是真时网址(即JS接口安全域名)的host部分;

于是带着“我遇到的问题肯定别人遇到过”的心态去找解决办法,最终解决办法如下:

在nginx反向代理配置文件添加如下代码:

 location /xxxxxx {
        proxy_pass http://xx.xx.xx.xx/xxxxxx; //目标服务器地址
        proxy_set_header    Host             $host;
        proxy_set_header    X-Real-IP        $remote_addr;
        proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header    HTTP_X_FORWARDED_FOR $remote_addr;
        proxy_redirect      default;
    }
公众号--当使用反向代理后php中$_SERVER[HTTP_HOST]方法获取的host有问题_第2张图片
Nginx配置部分

可以获取到当前真实url地址了

你可能感兴趣的:(公众号--当使用反向代理后php中$_SERVER[HTTP_HOST]方法获取的host有问题)