使用PHP cURL登录站点后跳转子域名获取内容失败求助
问题根因与修复方案
核心问题点
- Cookie未配置跨子域名生效,登录后获取的Cookie仅作用于当前登录域名,子域名请求时未携带认证信息
- 未开启cURL自动跟随跳转,若站点登录接口返回302跳转,登录流程未执行完成,无法拿到有效认证Cookie
- Cookie文件使用相对路径/简写路径,PHP读写权限不足导致Cookie未正常存储/读取
- POST参数手动拼接未做编码,参数含特殊字符时会导致请求异常
- 未携带常规请求头,被站点反爬策略拦截判定为非法请求
修复后代码
<?php $username = 'user'; $password = 'pass'; $loginUrl = 'https://主站域名/login'; // 替换为实际登录接口地址 $targetUrl = 'https://子域名.主站域名/statistics'; // 替换为实际要抓取的子域名地址 // Cookie文件必须用绝对路径,确保PHP有读写权限 $cookieFile = __DIR__ . '/cookie.txt'; $ch = curl_init(); // 通用基础配置 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 开启自动跟随302/301跳转 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 配置跨子域名Cookie生效,替换为你的主域名,前面加.匹配所有子域名 curl_setopt($ch, CURLOPT_COOKIE, 'domain=.你的主域名.com; path=/'); // 模拟浏览器请求头,避免被反爬拦截 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'); curl_setopt($ch, CURLOPT_REFERER, $loginUrl); // 关闭SSL校验,若站点证书正常可删除这两行 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 执行登录请求 curl_setopt($ch, CURLOPT_URL, $loginUrl); curl_setopt($ch, CURLOPT_POST, 1); // POST参数用数组传递,cURL自动处理编码 curl_setopt($ch, CURLOPT_POSTFIELDS, [ 'user' => $username, 'password' => $password ]); $loginRes = curl_exec($ch); // 可选:打印登录返回结果,校验是否登录成功 // var_dump($loginRes); // 请求子域名目标页面 curl_setopt($ch, CURLOPT_URL, $targetUrl); curl_setopt($ch, CURLOPT_HTTPGET, 1); // 切换为GET请求 $content = curl_exec($ch); curl_close($ch); // 写入文件用绝对路径 file_put_contents(__DIR__ . '/file.txt', $content); ?>
额外注意事项
- 先确认登录接口的参数名是否正确,很多站点登录参数不是
user和password,需要按实际表单参数名替换 - 部分站点登录会要求携带CSRF Token,需要先请求登录页面获取Token后再提交登录请求
- 若子域名和主域名的站点是独立认证体系,需要单独针对子域名做登录处理
内容的提问来源于stack exchange,提问作者Cormega
相关产品推荐
相关产品推荐

