From 11378a7e0c7d666627926c0344fd1520d76b07d0 Mon Sep 17 00:00:00 2001 From: wood chen Date: Sat, 22 Mar 2025 18:48:43 +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=A0=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=99=A8User-Agent=E5=92=8CReferer=EF=BC=8C=E4=BB=A5=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E7=9B=AE=E6=A0=87URL=E7=9A=84=E5=8F=AF=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E6=80=A7=E5=92=8C=E5=85=BC=E5=AE=B9=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/proxy.go | 6 ++++++ internal/utils/utils.go | 23 ++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/internal/handler/proxy.go b/internal/handler/proxy.go index f93e334..e417282 100644 --- a/internal/handler/proxy.go +++ b/internal/handler/proxy.go @@ -222,6 +222,12 @@ 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") + + // 设置Referer为源站的host + proxyReq.Header.Set("Referer", fmt.Sprintf("%s://%s", parsedURL.Scheme, parsedURL.Host)) + // 特别处理图片请求 if utils.IsImageRequest(r.URL.Path) { // 获取 Accept 头 diff --git a/internal/utils/utils.go b/internal/utils/utils.go index c2ce539..0c119c4 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -8,6 +8,7 @@ import ( "log" "net" "net/http" + neturl "net/url" "path/filepath" "proxy-go/internal/config" "slices" @@ -337,36 +338,44 @@ func GetTargetURL(client *http.Client, r *http.Request, pathConfig config.PathCo } // isTargetAccessible 检查目标URL是否可访问 -func isTargetAccessible(client *http.Client, url string) bool { +func isTargetAccessible(client *http.Client, targetURL string) bool { // 先查缓存 - if cache, ok := accessCache.Load(url); ok { + if cache, ok := accessCache.Load(targetURL); ok { cacheItem := cache.(accessibilityCache) if time.Since(cacheItem.timestamp) < accessTTL { return cacheItem.accessible } - accessCache.Delete(url) + accessCache.Delete(targetURL) } - req, err := http.NewRequest("HEAD", url, nil) + req, err := http.NewRequest("HEAD", targetURL, nil) if err != nil { - log.Printf("[Check] Failed to create request for %s: %v", url, err) + log.Printf("[Check] Failed to create request for %s: %v", targetURL, err) return false } + // 添加浏览器User-Agent + req.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为目标域名 + if parsedURL, parseErr := neturl.Parse(targetURL); parseErr == nil { + req.Header.Set("Referer", fmt.Sprintf("%s://%s", parsedURL.Scheme, parsedURL.Host)) + } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() req = req.WithContext(ctx) resp, err := client.Do(req) if err != nil { - log.Printf("[Check] Failed to access %s: %v", url, err) + log.Printf("[Check] Failed to access %s: %v", targetURL, err) return false } defer resp.Body.Close() accessible := resp.StatusCode >= 200 && resp.StatusCode < 400 // 缓存结果 - accessCache.Store(url, accessibilityCache{ + accessCache.Store(targetURL, accessibilityCache{ accessible: accessible, timestamp: time.Now(), })