DetectCloudflareCDN 检测是否使用Cloudflare CDN
(domain string)
| 254 | |
| 255 | // DetectCloudflareCDN 检测是否使用Cloudflare CDN |
| 256 | func DetectCloudflareCDN(domain string) bool { |
| 257 | if domain == "" { |
| 258 | return false |
| 259 | } |
| 260 | |
| 261 | // 方法1: 检查Cloudflare特有的/cdn-cgi/trace端点 |
| 262 | url := fmt.Sprintf("https://%s/cdn-cgi/trace", domain) |
| 263 | |
| 264 | // 创建HTTP客户端,设置较短的超时时间 |
| 265 | client := &http.Client{ |
| 266 | Timeout: 3 * time.Second, |
| 267 | } |
| 268 | |
| 269 | // 发送请求 |
| 270 | resp, err := client.Get(url) |
| 271 | if err == nil { |
| 272 | defer resp.Body.Close() |
| 273 | |
| 274 | // 如果状态码是200,说明存在/cdn-cgi/trace端点 |
| 275 | if resp.StatusCode == 200 { |
| 276 | // 读取响应内容进行进一步验证 |
| 277 | body, err := io.ReadAll(resp.Body) |
| 278 | if err == nil { |
| 279 | bodyStr := string(body) |
| 280 | // 检查响应内容是否包含Cloudflare特征 |
| 281 | if strings.Contains(bodyStr, "fl=") || |
| 282 | strings.Contains(bodyStr, "h=") || |
| 283 | strings.Contains(bodyStr, "colo=") || |
| 284 | strings.Contains(bodyStr, "gateway=") { |
| 285 | return true |
| 286 | } |
| 287 | } |
| 288 | } |
| 289 | } |
| 290 | |
| 291 | // 方法2: 检查HTTP响应头中的Cloudflare标识 |
| 292 | resp2, err := client.Get(fmt.Sprintf("https://%s", domain)) |
| 293 | if err == nil { |
| 294 | defer resp2.Body.Close() |
| 295 | |
| 296 | // 检查响应头中的Cloudflare标识 |
| 297 | server := resp2.Header.Get("Server") |
| 298 | cfRay := resp2.Header.Get("CF-Ray") |
| 299 | cfCache := resp2.Header.Get("CF-Cache-Status") |
| 300 | |
| 301 | if strings.Contains(strings.ToLower(server), "cloudflare") || |
| 302 | cfRay != "" || |
| 303 | cfCache != "" { |
| 304 | return true |
| 305 | } |
| 306 | } |
| 307 | |
| 308 | return false |
| 309 | } |
| 310 | |
| 311 | // DetectCDN 检测是否使用CDN(通用实现) |
| 312 | func DetectCDN(domain string) bool { |
no test coverage detected