遇到了什麼問題
我們在進行微信應用開發的時候,經常驗證域名的問題。微信爲了驗證域名是不是當前開發者管理的,通常會給你一個以.txt文件結尾的文件,例如WW_verify_CTcR0MDAUlF3b0Dn.txt,並且讓你把該文件上傳到你的網站的根目錄,例如http://wx.qq.com/WW_verify_CTcR0MDAUlF3b0Dn.txt這樣。那如果我們管理的微信應用很多或者我們需要頻繁的切換域名(例如測試公衆號總是在線上和線下之間進行來回的切換)甚至我們就微信公衆號或者企業微信的第三方開發者我們的根目錄下豈不是會有很多的亂七八糟的文件。我們還不能隨便的刪除,下一次驗證的時候還要重新上傳。
提出如下要求
- 所有的文件都是可以在一個單獨的文件夾中進行管理,儘量不影響根目錄的整潔性。
- 多個服務器時不需要上傳多次文件(主要針對測試環境和線上環境)
- 對於已經驗證過的文件不能刪除,爲了再次驗證域名做準備
- 不影響其他txt文件的正常訪問
- 一個主體的域名多次驗證,不需要多次上傳文件。
發現了什麼規律
暫時發現的需要驗證的那些場景
我暫時接觸到的微信應用暫時發現如下三個場景會驗證域名
- 微信公衆號:微信公衆號的jssdk的調用會驗證域名。
- 微信小程序:微信小程序的業務域名配置時會驗證域名。
- 企業微信:企業微信下應用如果需要使用jssdk的話需要驗證域名
注:微信小程序的webview如果要是要用jssdk,需要給微信公衆號的jssdk域名進行驗證,注意不是小程序的業務域名驗證,是小程序綁定的公衆號的域名(當時可坑死我了)
文件的特性
- 我們發現如上場景的文件都是.txt結尾的。
- 微信公衆號都是以MP_verify_**.txt結尾的 ** 就是文件的內容。
- 微信企業哈都是以WW_verify_**.txt結尾的 **就是文件內容。
- 微信小程序則是**.txt 命名的(我吐了 我以爲能找到規律那)。
- 當微信應用的主體不發生變化的是 文件不會發生變化 文件名字也。不變化。
- 當微信應用的主體不發生變化的情況下,域名發生變化,文件名字也不會變化,內容也不變。
- 驗證過的域名切換過之後仍需要再次驗證。
怎麼變化
我們通過如上的規則發現,微信的域名驗證文件其實沒有特別的標識,只指導是txt文件,那我們就針對txt文件入手
基本思路
針對要求的四點我們提出如下的解決思路
- nginx進行配置規則,當結尾爲txt的時候先去正常的路徑獲取,當返回404錯誤碼的時候,去另一個文件夾獲取數據。
- nginx在獲取文件的時候直接重寫的一個固定的服務器,這樣就能保證線下和線上只需要上傳一個文件即可。
- 上傳文件之後要寫REMARK,不進行刪除。方便下次再此驗證
實現細節
nginx配置文件
location ~* \.txt { # txt結尾
sendfile on;
tcp_nopush on;
tcp_nodelay off;
root /data1/users/wangjingming/webroot; #正常訪問路徑
#expires 1h;
error_page 404 =200 @weixin_verify;# 404之後執行的操作
}
location @weixin_verify {
rewrite ^/(.*)$ /temp/weixin_verify/$1 last; #把路徑重寫
proxy_pass http://localhost;#把請求代理到那個域名下 這裏我省事放到了本地
}
注意由於第一個location塊使用的正則那代理只能使用URI的形式。所以要重寫路由規則。
具體效果
當我們輸入在瀏覽器中輸入 http://**/WW_verify_CTcR0MDAUlF3b0Dn.txt時,nginx會先去根目錄下找有沒有相關文件,如果有則返回,如果沒有則返回404這時404會被weixin_verify 塊進行處理,當前請求會被代理到某臺服務器的/temp/weixin_verify目錄下繼續查找,如果有返回文件,如果沒有則返回404.