自从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(不是

最后修改:2024 年 04 月 16 日

感谢看完,可以点个赞~请作者喝杯咖啡~ヾ(◍°∇°◍)ノ゙❤