From c2266a60d6abdbff3f46e5fabdcf0ada65a0a185 Mon Sep 17 00:00:00 2001 From: wood chen Date: Mon, 24 Mar 2025 12:00:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E8=AF=B7=E6=B1=82=E5=A4=B4?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=8C=E6=B7=BB=E5=8A=A0Origin=E5=92=8CAcc?= =?UTF-8?q?ept-Encoding=E5=A4=B4=EF=BC=8C=E7=A1=AE=E4=BF=9D=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E8=AF=B7=E6=B1=82=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7?= =?UTF-8?q?=E5=92=8C=E7=A8=B3=E5=AE=9A=E6=80=A7=E3=80=82=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0User-Agent=E5=92=8CReferer=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=9B=B4=E7=81=B5=E6=B4=BB=E7=9A=84=E8=AF=B7=E6=B1=82=E5=A4=84?= =?UTF-8?q?=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + internal/handler/proxy.go | 42 +++++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index f07ff2e..9033da3 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ data/metrics/status_codes.json data/config.example.json data/config.json .env +data/cache diff --git a/internal/handler/proxy.go b/internal/handler/proxy.go index e417282..e94fac4 100644 --- a/internal/handler/proxy.go +++ b/internal/handler/proxy.go @@ -223,10 +223,35 @@ func (h *ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { copyHeader(proxyReq.Header, r.Header) // 添加常见浏览器User-Agent - proxyReq.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + if ua := r.Header.Get("User-Agent"); ua != "" { + proxyReq.Header.Set("User-Agent", ua) + } else { + proxyReq.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + } - // 设置Referer为源站的host - proxyReq.Header.Set("Referer", fmt.Sprintf("%s://%s", parsedURL.Scheme, parsedURL.Host)) + // 添加Origin + proxyReq.Header.Set("Origin", fmt.Sprintf("%s://%s", parsedURL.Scheme, parsedURL.Host)) + + // 设置Referer为源站的完整域名(带上斜杠) + proxyReq.Header.Set("Referer", fmt.Sprintf("%s://%s/", parsedURL.Scheme, parsedURL.Host)) + + // 设置Host头和proxyReq.Host + proxyReq.Header.Set("Host", parsedURL.Host) + proxyReq.Host = parsedURL.Host + + // 确保设置适当的Accept头 + if accept := r.Header.Get("Accept"); accept != "" { + proxyReq.Header.Set("Accept", accept) + } else { + proxyReq.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7") + } + + // 确保设置Accept-Encoding + if acceptEncoding := r.Header.Get("Accept-Encoding"); acceptEncoding != "" { + proxyReq.Header.Set("Accept-Encoding", acceptEncoding) + } else { + proxyReq.Header.Set("Accept-Encoding", "gzip, deflate, br") + } // 特别处理图片请求 if utils.IsImageRequest(r.URL.Path) { @@ -244,12 +269,13 @@ func (h *ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { proxyReq.Header.Set("CF-Image-Format", "auto") // 让 Cloudflare 根据 Accept 头自动选择格式 } - // 设置其他必要的头部 - proxyReq.Host = parsedURL.Host - proxyReq.Header.Set("Host", parsedURL.Host) + // 设置最小必要的代理头部 proxyReq.Header.Set("X-Real-IP", utils.GetClientIP(r)) - proxyReq.Header.Set("X-Forwarded-Host", r.Host) - proxyReq.Header.Set("X-Forwarded-Proto", r.URL.Scheme) + + // 如果源站不严格要求Host匹配,可以保留以下头部 + // 否则可能需要注释掉这些头部 + // proxyReq.Header.Set("X-Forwarded-Host", r.Host) + // proxyReq.Header.Set("X-Forwarded-Proto", r.URL.Scheme) // 添加或更新 X-Forwarded-For if clientIP := utils.GetClientIP(r); clientIP != "" {