使用Nginx反代jsdelivr与PHP反代jsdelivr时遇到的一些问题

自从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

软件开发软件分享

1 个赞