案例重現(xiàn):
當(dāng)集成jssdk時(shí),生成簽名signature參數(shù)環(huán)節(jié)需要涉及到獲取當(dāng)前有效URL地址的操作,如下wx.config:
wx.config({
debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù)鳄哭,可以在pc端打開篇恒,參數(shù)信息會(huì)通過log打出腮考,僅在pc端時(shí)才會(huì)打印晋修。
appId: '', // 必填晨继,公眾號(hào)的唯一標(biāo)識(shí)
timestamp: , // 必填增炭,生成簽名的時(shí)間戳
nonceStr: '', // 必填忍燥,生成簽名的隨機(jī)串
signature: '',// 必填,簽名隙姿,見附錄1
jsApiList: [] // 必填梅垄,需要使用的JS接口列表,所有JS接口列表見附錄2
});
signature生成方法:
繼續(xù)......
由于在微信管理后臺(tái)所設(shè)置的‘JS接口安全域名’使用了反向代理(因?yàn)檫@個(gè)域名備案了 所以使用反向代理到另一個(gè)沒有備案的服務(wù)器B-server ,B-server就是代碼部署的服務(wù)器]);
重點(diǎn)來了......
在使用php獲取當(dāng)前網(wǎng)址時(shí)输玷,網(wǎng)上大多都給了這樣一段代碼:
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
今天我要說的是 $_SERVER[HTTP_HOST] 這個(gè)東西队丝,當(dāng)使用了反向代理時(shí),它獲取到的host是代碼部署服務(wù)器的ip地址而不是真時(shí)網(wǎng)址(即JS接口安全域名)的host部分欲鹏;
于是帶著“我遇到的問題肯定別人遇到過”的心態(tài)去找解決辦法机久,最終解決辦法如下:
在nginx反向代理配置文件添加如下代碼:
location /xxxxxx {
proxy_pass http://xx.xx.xx.xx/xxxxxx; //目標(biāo)服務(wù)器地址
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;
}
?? 可以獲取到當(dāng)前真實(shí)url地址了