nginx反向代理微信公众号的文章

需求来源

一个小程序里面需要使用WebView来展示微信公众号的文章,但是小程序里面WebView的域名和公众号的域名不一致,所以需要通过nginx反向代理来解决。

解决过程中发现文章中会有图片和视频等,所以需要将图片和视频的URL也进行反向代理,否则图片和视频无法正常显示。

实现思路

  1. 在location块中添加一个proxy_pass指令,将请求转发到微信公众号的域名。
  2. 设置 proxy_set_header指令,将请求头中的Host字段设置为微信公众号的域名。
  3. 设置 proxy_set_header指令,将请求头中的Referer字段设置为微信公众号的域名。
  4. 设置 proxy_set_header指令,将请求头中的Accept-Encoding字段设置为空,方便后面做内容替换。
  5. 设置sub_filter将内容中新出现的地址(链接、图片、视频)等替换为转发地址。
  6. CSS或一些样式里面,存在图片等资源作为背景或其他的,所以额外再添加一个location配置。

配置示例

location /mps/ {
  proxy_pass https://mp.weixin.qq.com/;
  proxy_set_header Accept-Encoding "";
  proxy_set_header Referer 'https://mp.weixin.qq.com/';
  sub_filter 'src="/mp/' 'src="/mps/mp/';
  sub_filter 'https://mmbiz.qpic.cn/' '/mpsimg/';
  sub_filter 'http://mmbiz.qpic.cn/' '/mpsimg/';
  sub_filter 'https:\/\/mmbiz.qpic.cn\/' '\/mpsimg\/';
  sub_filter 'http:\/\/mmbiz.qpic.cn\/' '\/mpsimg\/';
  sub_filter 'https://mpvideo.qpic.cn/' '/mpsvideo/';
  sub_filter 'http://mpvideo.qpic.cn/' '/mpsvideo/';
  sub_filter 'https:\/\/mpvideo.qpic.cn\/' '\/mpsvideo\/';
  sub_filter 'http:\/\/mpvideo.qpic.cn\/' '\/mpsvideo\/';
  sub_filter 'http://mp.weixin.qq.com/' '/mps/';
  sub_filter 'https://mp.weixin.qq.com/' '/mps/';
  sub_filter 'http:\/\/mp.weixin.qq.com\/' '/mps/';
  sub_filter 'https:\/\/mp.weixin.qq.com\/' '/mps/';
  sub_filter '<meta name="referrer" content="origin-when-cross-origin">' '<meta name="referrer" content="no-referrer">';
  sub_filter '<meta name="referrer" content="strict-origin-when-cross-origin">' '';
  sub_filter_types *;
  sub_filter_once off;
}

location /mpsimg/ {
  proxy_pass https://mmbiz.qpic.cn/;
  proxy_set_header Accept-Encoding "";
  proxy_set_header Referer 'https://mp.weixin.qq.com/';
}

location /mpsvideo/ {
  proxy_pass https://mpvideo.qpic.cn/;
  proxy_set_header Accept-Encoding "";
  proxy_set_header Referer 'https://mp.weixin.qq.com/';
}

location /mp/ {
  proxy_pass https://mp.weixin.qq.com/mp/;
  proxy_set_header Accept-Encoding "";
  proxy_set_header Referer '';
  sub_filter 'src="/mp/' 'src="/mps/mp/';
  sub_filter 'https://mmbiz.qpic.cn/' '/mpsimg/';
  sub_filter 'http://mmbiz.qpic.cn/' '/mpsimg/';
  sub_filter 'https:\/\/mmbiz.qpic.cn\/' '\/mpsimg\/';
  sub_filter 'http:\/\/mmbiz.qpic.cn\/' '\/mpsimg\/';
  sub_filter 'https://mpvideo.qpic.cn/' '/mpsvideo/';
  sub_filter 'http://mpvideo.qpic.cn/' '/mpsvideo/';
  sub_filter 'https:\/\/mpvideo.qpic.cn\/' '\/mpsvideo\/';
  sub_filter 'http:\/\/mpvideo.qpic.cn\/' '\/mpsvideo\/';
  sub_filter 'http://mp.weixin.qq.com/' '/mps/';
  sub_filter 'https://mp.weixin.qq.com/' '/mps/';
  sub_filter 'http:\/\/mp.weixin.qq.com\/' '/mps/';
  sub_filter 'https:\/\/mp.weixin.qq.com\/' '/mps/';
  sub_filter '<meta name="referrer" content="origin-when-cross-origin">' '<meta name="referrer" content="no-referrer">';
  sub_filter '<meta name="referrer" content="strict-origin-when-cross-origin">' '';
  sub_filter_types *;
  sub_filter_once off;
}