自从cdn.jsdelivr.net被拦截之后,大量个人博客轻则图片无法加载,重则样式错乱,有些切换到备用节点,但依旧处于不稳定的状态,所以考虑使用Nginx实现反向代理,也考虑过使用PHP,但是PHP的性能在哪里,而且有诸多限制,不过也记录一下吧
Nginx教程
在直接通过1panel面板去创建反代时,访问反代地址时,会出现 421
或者 403
的状态码错误,搜了下这两个错误码,最后发现是反代配置的问题,完整的配置规则如下:
注意,我这里直接反代路径加上了自己的用户名,这样可以有效防止其它人公开使用,导致自己的域名被墙或者被拿去做违法资源,如需公开使用,请将
https://cdn.jsdelivr.net/gh/OuOumm/
替换为https://cdn.jsdelivr.net/gh/
,/gh/OuOumm/
替换为/gh/
proxy_cache_valid 200 304 301 302 7d;
这段表示将符合该状态码的请求缓存7天
421 Misdirected Request
那么为什么会出现421这个错误呢?首先我们看一下421这个状态码到底是什么意思
客户端需要为此请求建立新连接,因为请求的主机名与用于此连接的服务器名称指示 (SNI) 不匹配。
Misdirected Request
这段话具体怎么理解呢,其实很简单,意思就是,你所反代的域名,使用的通配符SSL证书,即 *.jsdelivr.net
,导致访问的时候,服务端不知道你想访问的究竟是那个域名,所以出现了421报错,所以我们这里通过设置SSL的请求主机,跟SSL主机名。
proxy_ssl_server_name on;
proxy_ssl_name cdn.jsdelivr.net;
proxy_ssl_verify off;
403 错误
403其实很容易解释了,就是你没有权限去访问,为什么呢?因为1panel创建的反向代理使用的主机头,也就是Host
这个header头不对,默认给的是$host
。
但实际并没有单独匹配域名之后赋给这个变量,而是直接将你创建的反代路径,一起丢给了这个$host
,导致主机头不对,所以出现了403报错。
解决办法其实很简单,只需要自己设置主机头,而不是使用他提供的$host
,这里直接将$host
修改为cdn.jsdelivr.net
,就可以解决403错误了。
PHP教程
PHP其实挺有意思的,配合Cloudflare
的缓存,可以实现一次访问之后,全站靠缓存进行反代,而不是每次都通过php去请求,当然,Nginx也是同理,只不过需要配置Cloudflare
大善人的缓存配置。
tips: 至于Cloudflare
的缓存如何配置,会重开一篇博文。
php下的实现方式有两种,一种是单文件反代,一种是通过重写http请求并输出进行目录整体反代(这个占用大一点,不过有Cloudflare大善人的全局缓存也没啥问题)
单文件反代
php有个curl请求模块,反代也是通过这个实现的,本质上就是由服务器去请求数据,将数据拿回后展示给用户,那么在拿回数据后,Cloudflare缓存配置生效,后面所有请求,会优先访问缓存,由缓存提供给用户,大大减少了源服务器的开销问题。
这段代码也可以实现反代所有网站文件,具体怎么用就看各位自己的需求了。
建议配置防盗链或者设置请求白名单,加上判断主机头
如果觉得不满足你的需求,但是你又不会PHP代码,怎么办!丢给Chatgpt
啊,好用,这段代码就是Chatgpt
写的。
目录反代
这个操作比较骚气,我也是看大佬的实现的,也是由Chatgpt
写的,反正挺牛逼(
同时加上伪静态:
Nginx:
location / {
try_files $uri $uri/ /index.php?$args;
}
Apache:
RewriteEngine on
RewriteBase /
RewriteCond $1 ^(index\.php)?$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} ^index\.php?$
RewriteRule ^(.*)$ - [S=1]
RewriteRule . /index.php [L]
基本都搞定了,没啥大问题了,有报错的话,建议直接咨询Chatgpt(不是