WordPress的CDN在19年被国内攻击后(存疑),一直屏蔽了大陆IP的访问,从大陆访问WP的服务都会返回429 Too Many Requests
。虽然WP官方社区并不承认屏蔽了大陆地区的访问(相关链接),但是事实上包括更新、插件、主题等服务一直处于不可用的状态。另外即使抛开屏蔽的问题,Automattic的CDN到国内依然是比较缓慢的。
为了解决这个问题,在这之前有Kill429
的插件,是一种基于主动的正向代理的方案,最近流行的WP-ChinaYes
则是一个基于反向代理的方案,并且你可以自己搭建反向代理的源。
WP-ChinaYes这个插件是 @孙锡源 制作的,GitHub项目地址(点击前往),在此表示感谢( ̄▽ ̄)”,WordPress正是因为这样一群开源共享的开发者们才变得更完美。
反代演示站:
cn.lty.fun*提示:该方案可能失效,且目前屏蔽已解除,建议选择主动代理或自行测试修改。
一、插件安装
直接在GitHub的Release(点击前往)下载插件,解压到主题/wp-content/plugins
目录即可(其实商店也能搜到(已被下架),不过要装这个插件的商店估计都没法用吧)。
二、自有源搭建
如果你担心别人提供的源稳定性、安全性可能存在隐患(比如劫持下载的压缩包),你也可以选择自己去搭建一个源。当然你也可以共享出来让大家一起用,毕竟个人的力量是有限的,人多了才能保证服务稳定下去。
按照WP的需求一共要配置10个反代,推荐使用泛域名的SSL证书。免费的有Let’s Encrypt,如果你不会使用acme.sh,可以使用FreeSSL申请。(有人提到Let‘s Encrypt的OCSP地址被污染了,实际上Chrome/Firefox都不校验LET的证书,不会对正常使用造成很大影响。)
下文的反代配置,我是按照最简化写的,并没有添加有关缓存的内容(因为个人觉得没必要),如果需要缓存自己配置CDN即可。其他关于Vhost的配置就不再赘述,SSL什么的自己配置就好了,按照你的习惯是用宝塔还是LNMP随你们,都一样的。
2.1 服务器的选择
搭建反向代理,你首先必须得保证你的服务器到WP的CDN是正常通信的(位于大陆以外的地区)。其次国内云厂基本都是使用电信163链路进行跨境访问,你需要准备一个对于大陆速度较为稳定的服务器,GIA最佳,其他的诸如阿里轻量、Azure、谷歌云等都是可以接受的。
至于CDN,国内的CDN均采用运营商托管节点,其跨境回源质量只能是低于阿里云、腾讯云等云厂商的顶级163商宽,所以个人认为从服务器向官方API发起的访问请求没必要让它去走CDN。
2.2 反代域名的准备
反代首先你得想好反代啥用啥域名。泛域名证书保护的范围是同级的域名,即*.lty.fun
无法保护*.cn.lty.fun
,所以在选择反代的域名时请不要再向上加级数了(你要申请10个个DV证书我也不拦着你233333)。
另外后面经过优化,可以使用一个域名的不同目录完成反代,具体可以往下翻。
序号 | 官方地址 | 反代地址 | 描述 |
① | api.wordpress.org | apiworg.cn.lty.fun | API请求地址 |
② | downloads.wordpress.org | dl-wp-org.cn.lty.fun | 下载地址 |
③ | developer.wordpress.org | dev-wp-org.cn.lty.fun | 开发者API |
④ | profiles.wordpress.org | pf-wp-org.cn.lty.fun | |
⑤ | ps.w.org | psworg.cn.lty.fun | 插件页静态资源 |
⑥ | s.w.org | sworg.cn.lty.fun | 静态资源 |
⑦ | ts.w.org | tsworg.cn.lty.fun | 主题页静态资源 |
⑧ | wordpress.org | wp-org.cn.lty.fun | 官网 |
⑨ | wp-themes.com | wp-themes.cn.lty.fun | 主题官网 |
⑩ | secure.gravatar.com | grv.luotianyi.vc | 头像 |
三、反代配置
为了降低维护的成本,在优化之后可以使用3个域名完成反代1个域名完成所有反代。之前测试出现的冲突经过@孙锡源的调试修正了冲突点,推荐使用此种方案。
注意WP程序本身可能与嵌入的链接存在冲突,所以api和download两个不能使用域名目录格式,我这里就以/api
和/dl
反代这两个域名(其他目录均为网址作为路径,当然你修改配置文件中其他的目录也可以)。
*注意:以下代码框若未正常加载或无法复制请F5刷新此页面;若您来自搜索引擎MIP页面,请去掉URL中
?mip
参数前往本站源页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
##RBQ-Proxy-START #PROXY-API location /api/ { proxy_pass https://api.wordpress.org/; proxy_set_header Host api.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; proxy_redirect https://developer.wordpress.org https://cn.lty.fun/developer.wordpress.org; gzip off; sub_filter ps.w.org cn.lty.fun/ps.w.org; sub_filter downloads.wordpress.org cn.lty.fun/dl; sub_filter profiles.wordpress.org cn.lty.fun/profiles.wordpress.org; sub_filter secure.gravatar.com cn.lty.fun/secure.gravatar.com; sub_filter 0.gravatar.com cn.lty.fun/secure.gravatar.com; sub_filter 1.gravatar.com cn.lty.fun/secure.gravatar.com; sub_filter 2.gravatar.com cn.lty.fun/secure.gravatar.com; sub_filter ts.w.org cn.lty.fun/ts.w.org; sub_filter wp-themes.com cn.lty.fun/wp-themes.com; sub_filter s.w.org cn.lty.fun/s.w.org; sub_filter wordpress.org cn.lty.fun/wordpress.org; sub_filter_last_modified on; sub_filter_once off; sub_filter_types application/json; } #PROXY-DL location /dl/ { proxy_pass https://downloads.wordpress.org/; proxy_set_header Host downloads.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_redirect https://wordpress.org/download/ https://cn.lty.fun/wordpress.org/download/; } #PROXY-Developer location /developer.wordpress.org/ { proxy_pass https://developer.wordpress.org/; proxy_set_header Host developer.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; gzip off; sub_filter downloads.wordpress.org cn.lty.fun/dl; sub_filter developer.wordpress.org cn.lty.fun/developer.wordpress.org; sub_filter ps.w.org cn.lty.fun/ps.w.org; sub_filter_last_modified on; sub_filter_once off; } #PROXY-WPORG location /wordpress.org/ { proxy_pass https://wordpress.org/; proxy_set_header Host wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; gzip off; sub_filter //wordpress.org //cn.lty.fun/wordpress.org; sub_filter s.w.org cn.lty.fun/s.w.org; sub_filter downloads.wordpress.org cn.lty.fun/downloads.wordpress.org; sub_filter_last_modified on; sub_filter_once off; } #PROXY-WP-Theme location /wp-themes.com/ { proxy_pass https://wp-themes.com/; proxy_set_header Host wp-themes.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; gzip off; sub_filter wp-themes.com cn.lty.fun/wp-themes.com; sub_filter_last_modified on; sub_filter_once off; } #PROXY-Profiles location /profiles.wordpress.org/ { proxy_pass https://profiles.wordpress.org/; proxy_set_header Host profiles.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-Secure location /secure.gravatar.com/ { proxy_pass https://secure.gravatar.com/; proxy_set_header Host secure.gravatar.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-Ps location /ps.w.org/ { proxy_pass https://ps.w.org/; proxy_set_header Host ps.w.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-Ts location /ts.w.org/ { proxy_pass https://ts.w.org/; proxy_set_header Host ts.w.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-S location /s.w.org/ { proxy_pass https://s.w.org/; proxy_set_header Host s.w.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } ##RBQ-Proxy-END |
从这里开始是原始的10个反代的方案,虽然麻烦一些不过经过验证是肯定没有问题的,如果你无法正确配置前面的目录反代,请选择原始的反代模式。
api.wordpress.org
WordPress的API反代,供服务器向WP的请求,可以不用套CDN。其中涉及到一个跳转(有没有都一样)和8个文本替换,其中替换成的链接请自己想好,后面都要对应的搭建反代。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#PROXY-START/ location / { proxy_pass https://api.wordpress.org; proxy_set_header Host api.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; proxy_redirect https://developer.wordpress.org https://dev-wp-org.cn.lty.fun; gzip off; sub_filter ps.w.org psworg.cn.lty.fun; sub_filter downloads.wordpress.org dl-wp-org.cn.lty.fun; sub_filter profiles.wordpress.org pf-wp-org.cn.lty.fun; sub_filter secure.gravatar.com grv.luotianyi.vc; sub_filter ts.w.org tsworg.cn.lty.fun; sub_filter wp-themes.com wp-themes.cn.lty.fun; sub_filter s.w.org sworg.cn.lty.fun; sub_filter wordpress.org wp-org.cn.lty.fun; sub_filter_last_modified on; sub_filter_once off; sub_filter_types application/json; } #PROXY-END/ |
downloads.wordpress.org
WordPress的下载地址,用于服务器下载软件包,可以不套CDN。
1 2 3 4 5 6 7 8 9 10 |
#PROXY-START/ location / { proxy_pass https://downloads.wordpress.org; proxy_set_header Host downloads.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-END/ |
developer.wordpress.org
WP开发者API相关的,用于服务器请求API,可以不套CDN。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#PROXY-START/ location / { proxy_pass https://developer.wordpress.org; proxy_set_header Host developer.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; gzip off; sub_filter developer.wordpress.org dev-wp-org.cn.lty.fun; sub_filter ps.w.org psworg.cn.lty.fun; sub_filter downloads.wordpress.org dl-wp-org.cn.lty.fun; sub_filter_last_modified on; sub_filter_once off; } #PROXY-END/ |
profiles.wordpress.org
不太清楚是干啥的,没看到前端加载,应该用不着套CDN。
1 2 3 4 5 6 7 8 9 10 11 |
#PROXY-START/ location / { proxy_pass https://profiles.wordpress.org; proxy_set_header Host profiles.wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-END/ |
ps.w.org
插件页静态文件(Plugin Ststaic),用于前端加载,建议使用CDN。
1 2 3 4 5 6 7 8 9 10 |
#PROXY-START/ location / { proxy_pass https://ps.w.org; proxy_set_header Host ps.w.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-END/ |
s.w.org
静态资源,用于前端加载,建议使用CDN。
1 2 3 4 5 6 7 8 9 10 |
#PROXY-START/ location / { proxy_pass https://s.w.org; proxy_set_header Host s.w.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } PROXY-END/ |
ts.w.org
主题页静态资源(Theme Static),用于前端加载,建议使用CDN。
1 2 3 4 5 6 7 8 9 10 |
#PROXY-START/ location / { proxy_pass https://ts.w.org; proxy_set_header Host ts.w.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-END/ |
wordpress.org
WP官网,意义不明,前端没看到有从这里加载文件,可以不套CDN。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#PROXY-START/ location / { proxy_pass https://wordpress.org; proxy_set_header Host wordpress.org; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; gzip off; sub_filter s.w.org sworg.cn.lty.fun; sub_filter //wordpress.org //wp-org.cn.lty.fun; sub_filter downloads.wordpress.org dl-wp-org.cn.lty.fun; sub_filter_last_modified on; sub_filter_once off; } #PROXY-END/ |
wp-themes.com
WP主题的链接,用于后台主题预览页面加载,可以套CDN。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#PROXY-START/ location / { proxy_pass https://wp-themes.com; proxy_set_header Host wp-themes.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Accept-Encoding ""; proxy_redirect https://wp-themes.com https://wp-themes.cn.lty.fun; gzip off; sub_filter wp-themes.com wp-themes.cn.lty.fun; sub_filter_last_modified on; sub_filter_once off; } #PROXY-END/ |
secure.gravatar.com
用于前端Gravatar头像的加载,建议使用CDN缓存。我之前做过反代这次就没有再搭建,对于其他前端的链接如果主题没有指定只需要修改/wp-includes/link-template.php
即可。
1 2 3 4 5 6 7 8 9 10 |
#PROXY-START/ location / { proxy_pass https://secure.gravatar.com; proxy_set_header Host secure.gravatar.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; } #PROXY-END/ |
头像的反代我在很久之前就自己搭建了一个,在这里也分享给大家( ̄▽ ̄)”
反代Gravatar加速网站头像加载
四、分享&结语
如果你真的看到了这里,并且搭建好了反代,那么非常感谢你的支持,社区因你而精彩!博主在这里也把我自己搭建的共享出来,有需要可以直接取用( ̄▽ ̄)”。
API服务器:
api.lty.fun/api
下载服务器:api.lty.fun/dl
如果你完成了反代的搭建,可以使用WP-China-Yes的“返璞归真”版本,直接将代码插入主题functions.php
末尾即可实现此功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * WP-ChinaYes By ibadboy.net */ <?php function my_pre_http_request($preempt, $r, $url) { if ( ! stristr($url, 'api.wordpress.org') && ! stristr($url, 'downloads.wordpress.org')) { return false; } $url = str_replace('api.wordpress.org', 'api.lty.fun/api', $url); $url = str_replace('downloads.wordpress.org', 'api.lty.fun/dl', $url); return wp_remote_request($url, $r); } add_filter('pre_http_request', 'my_pre_http_request', 10, 3); |
另外也建议大家使用二级域名、CNAME关联的方式,提高DNS记录管理的效率;同时SSL证书路径统一化,即使三个月更换一次两个文件的替换也是很方便的,当然如果你会使用acme.sh这个过程都可以自动化完成。这样不论日后是迁移还是维护,都能够获得极大的便利。
*原创文章,转载请注明出处
如果小于50mb资源是在GITHUB上的。。。。那jsdelivr他不更香么
前面用过一段时间,最后还是拿自己的服务器正向代理了,还是担心安全问题,等以后这个项目做大了先吧。
大佬图都在那儿找的啊
好!支持一下。
(虽说咱的服务器位于西欧这个文章对我来说没多大用就是了)