自从cdn.jsdelivr.net被拦截之后,大量个人博客轻则图片无法加载,重则样式错乱,有些切换到备用节点,但依旧处于不稳定的状态,所以考虑使用Nginx实现反向代理,也考虑过使用PHP,但是PHP的性能在哪里,而且有诸多限制,不过也记录一下吧
Nginx教程
在直接通过1panel面板去创建反代时,访问反代地址时,会出现 421
或者 403
的状态码错误,搜了下这两个错误码,最后发现是反代配置的问题,完整的配置规则如下:
location ^~ /gh/OuOumm/ {
proxy_ssl_server_name on;
proxy_ssl_name cdn.jsdelivr.net;
proxy_ssl_verify off;
proxy_pass https://cdn.jsdelivr.net/gh/OuOumm/;
proxy_set_header Host cdn.jsdelivr.net;
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 Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Cache-Control no-cache;
}
注意,我这里直接反代路径加上了自己的用户名,这样可以有效防止其它人公开使用,导致自己的域名被墙或者被拿去做违法资源,如需公开使用,请将
https://cdn.jsdelivr.net/gh/OuOumm/
替换为https://cdn.jsdelivr.net/gh/
,/gh/OuOumm/
替换为/gh/
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教程请查看原文博客:https://blog.warhut.cn/dmbj/1170.html