为何TIdHTTP.Head()抛出'HTTP/1.1 406 Not Acceptable'异常?
针对你遇到的HTTP/1.1 406 Not Acceptable异常,从以下几个方面逐一排查:
检查Request.Accept请求头:
406错误核心是服务器无法匹配客户端发送的Accept头要求。TIdHTTP默认的Accept头可能偏向网页类内容,部分服务器现在对Head请求的Accept头有严格限制。尝试手动设置适配zip文件的Accept值:IdHTTP1.Request.Accept := 'application/zip, */*';再执行Head请求测试。
验证SSL/TLS协议版本兼容性:
你当前配置的SSL版本包含了老旧的SSLv2、SSLv3,很多服务器已经禁用这些不安全的协议,可能导致服务器直接拒绝请求。尝试调整SSL配置,只保留高版本协议:IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_2; IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2]; // 若服务器支持TLS1.3,可追加sslvTLSv1_3(需对应版本的Indy支持)重新测试请求是否正常。
补全或调整其他必要请求头:
部分服务器会校验User-Agent、Referer等头信息,TIdHTTP默认的User-Agent可能被识别为非合法客户端。尝试设置一个标准的浏览器User-Agent:IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36';如果目标网站有防盗链机制,还需要设置对应的
Referer头。对比第三方工具的请求差异:
用curl命令模拟Head请求,验证服务器本身是否正常响应:curl -I https://www.myurl.com/myfile.zip如果curl能正常返回200状态码和Content-Length,就捕获TIdHTTP发送的请求头(可通过Wireshark抓包,或开启Indy的日志功能),对比curl的请求头,将TIdHTTP的请求头调整为一致格式。
确认服务器端配置变更:
既然之前正常现在报错,大概率是服务器端做了调整——比如Web服务器(Nginx/Apache)更新了配置、启用了WAF规则、限制了Head请求的Accept头范围。可联系服务器管理员确认近期是否有相关变更。升级Indy组件版本:
若你使用的是较旧版本的Indy,可能存在TLS协议处理或请求头构造的bug。尝试升级到最新稳定版的Indy组件后再测试请求。
内容的提问来源于stack exchange,提问作者delphirules

