測試服務器被新人誤操做直接刪除了根目錄,奈何只能重裝服務。結果致使微信掃碼支付時二維碼顯示不出來。php
測試環境訪問地址爲:http://www.excample.com:8067nginx
部署環境:Nginx + PHP服務器
服務器作過路由端口映射處理,詢問運維人員,得知是將外網的8067映射到內網的80端口微信
一、經過谷歌開發工具查看,獲取的 SERVER_PORT 不正確,正確爲8067運維
二、既然得知是端口獲取的問題,並且代碼沒有改動,是服務器從新部署的緣故致使的,因此想來也是配置的問題。工具
一開始懷疑是nginx的配置post
把監聽的80端口改爲8067,結果不能訪問。學習
那是固然,畢竟路由端口是映射到了內網的80而不是8067。開發工具
三、排除了上一步,接下去這最關鍵的想法折騰了我很久。我想怎麼讓 server_post 拿到的是外網端口8067而不是內網端口80。測試
接下去就是各類百度,這過程當中讓我學習到了一個知識點:php中的 server 全局變量是怎麼獲取的?
nginx的核心模塊中有些內置變量,以下圖這些:
並且是以fastcgi模式運行PHP,因此nginx會將這些變量傳遞給fastcgi,而fastcgi又會將這些做爲PHP的全局變量
到這裏,我才發現還有fastcgi的配置之說。那就仔細去看看fastcgi的配置。
這下可好,那我把 $SERVER_PORT 直接改爲8067,獲取到的確實爲8067了,二維碼圖片也出來了。但是再想一想,這樣改動不合理,假如端口映射規則修改了,豈不是還要改配置。因此這個方法不可行,另尋他法。
四、開始懷疑服務器從新部署後路由映射規則也被改動了
既然nginx內置變量$server_port只能拿到nginx配置中的的監聽端口。那麼server段中的監聽怎麼着也得改爲8067,要作的就是將路由映射修改成:外網的8067映射到內網的8067。
至此,問題解決了。一直覺得路由映射規則沒有改動,就一直死磕在了nginx和fstcgi的配置上了,耗費了太多時間。不過也好,深刻了解了 php 中 server 等一些全局變量的來源。