自從去年6月份畢業以后,從前端轉到了后端,也就很久沒有寫文章記錄了。
前情提要:
測試服務器被新人誤操作直接刪除了根目錄,奈何只能重裝服務。結果導致微信掃碼支付時二維碼顯示不出來。
已知情況:
測試環境訪問地址為:http://www.excample.com:8067
部署環境:Nginx + PHP
服務器做過路由端口映射處理,詢問運維人員,得知是將外網的8067映射到內網的80端口
跟蹤調試步驟:
1、通過谷歌開發工具查看,獲取的 SERVER_PORT 不正確,正確為8067
2、既然得知是端口獲取的問題,而且代碼沒有改動,是服務器重新部署的緣故導致的,所以想來也是配置的問題。
一開始懷疑是nginx的配置
把監聽的80端口改成8067,結果不能訪問。
那是當然,畢竟路由端口是映射到了內網的80而不是8067。
3、排除了上一步,接下去這最關鍵的想法折騰了我好久。我想怎么讓 server_post 拿到的是外網端口8067而不是內網端口80。
接下去就是各種百度,這過程中讓我學習到了一個知識點:php中的 server 全局變量是怎么獲取的?
nginx的核心模塊中有些內置變量,如下圖這些:
而且是以fastcgi模式運行PHP,所以nginx會將這些變量傳遞給fastcgi,而fastcgi又會將這些作為PHP的全局變量
到這里,我才發現還有fastcgi的配置之說。那就仔細去看看fastcgi的配置。
這下可好,那我把 $SERVER_PORT 直接改成8067,獲取到的確實為8067了,二維碼圖片也出來了??墒窃傧胂?,這樣改動不合理,假如端口映射規則修改了,豈不是還要改配置。所以這個方法不可行,另尋他法。
4、開始懷疑服務器重新部署后路由映射規則也被改動了
既然nginx內置變量$server_port只能拿到nginx配置中的的監聽端口。那么server段中的監聽怎么著也得改成8067,要做的就是將路由映射修改為:外網的8067映射到內網的8067。
至此,問題解決了。一直以為路由映射規則沒有改動,就一直死磕在了nginx和fstcgi的配置上了,耗費了太多時間。不過也好,深入了解了 php 中 server 等一些全局變量的來源。
不積跬步無以至千里