为何浏览器可访问网站,wget/curl却返回403 Forbidden?
CloudFront返回403 Forbidden的排查与解决办法
一、进一步测试方向
- 完整复制浏览器请求头:打开浏览器开发者工具(F12),切换到「网络」标签,找到目标请求,复制全部请求头字段(包括Cookie、Accept、Accept-Language、Accept-Encoding、Connection等),直接粘贴到wget/curl命令中。示例curl命令:
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" \ -H "Referer: https://xxx.com/" \ -H "Cookie: 从浏览器复制的完整Cookie内容" \ -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ -H "Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" \ https://目标网址 - 验证Cookie有效性:部分CloudFront防护依赖会话Cookie,先在浏览器完成访问流程(如首页跳转、登录),再复制当前Cookie到请求中,测试是否能绕过限制。
- 核对请求方式:确认浏览器使用的是GET还是POST请求,wget默认用GET,若目标接口是POST,需调整命令(如wget加
--post-data参数)。 - 排查IP封禁:切换网络环境(如手机热点、代理)重新请求,判断是否是当前IP被CloudFront的WAF规则拉黑。
- 检查网站WAF配置(自有网站):若这是你自己的网站,登录AWS控制台查看CloudFront关联的WAF规则,确认是否存在限制非浏览器请求、高频请求的规则。
二、可行解决办法
- 使用无头浏览器模拟:用Playwright、Puppeteer这类工具完全模拟浏览器行为,包括JS渲染、Cookie自动管理、会话保持,避免被防护机制识别为非浏览器请求。
- 控制请求频率:若因请求过于频繁触发防护,给wget/curl添加间隔参数,比如wget用
--wait=3(每次请求间隔3秒),curl配合sleep命令批量请求。 - 模拟完整请求流程:先请求网站首页获取初始Cookie和会话标识,再携带这些信息请求目标页面,模拟用户正常访问路径。
- 联系网站管理员(第三方网站):若无法自行绕过,直接联系网站运维人员说明需求,申请解除对合法爬虫/请求的限制;自有网站则调整CloudFront和WAF规则,放行合规请求。
内容的提问来源于stack exchange,提问作者jkrow
相关产品推荐
相关产品推荐

