遇到了什么问题
我们在进行微信应用开发的时候,经常验证域名的问题。微信为了验证域名是不是当前开发者管理的,通常会给你一个以.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.