案例重现:
当集成jssdk时,生成签名signature参数环节需要涉及到获取当前有效URL地址的操作,如下wx.config:
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
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;
}
👌 可以获取到当前真实url地址了