libcurl 重定向url:

  • 301 永久重定向:请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。搜索引擎会将已收录的链接变为重定向之后的链接,权重也会转移到新的链接。
  • 302 临时重定向:服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。搜索引擎将继续保持展示已收录的链接。

获取重定向url有如下两种方法:
方法一: 通过HeaderLocation:获取

size_t HeaderCallback4Download(char *ptr,size_t size,size_t nmemb,void *userdata)
{//通过Location:获取重定向urlCurlDownloadContext* dld_ctx = (CurlDownloadContext*)userdata;const char key_loc[] = "Location:";if (_strnicmp(ptr, key_loc, strlen(key_loc)) == 0){dld_ctx->redirect_url.assign(ptr + strlen(key_loc));//去掉\r\nif (dld_ctx->redirect_url.size() > 2){dld_ctx->redirect_url.resize(dld_ctx->redirect_url.size() - 2);}}return size * nmemb;
}//设置头部回调
::curl_easy_setopt(pcurl, CURLOPT_HEADERFUNCTION, HeaderCallback4Download);
::curl_easy_setopt(pcurl, CURLOPT_HEADERDATA, &dld_ctx);

方法二:通过CURLINFO_REDIRECT_URL获取

CURLcode ret = ::curl_easy_perform(pcurl);
//执行完成之后获取状态码和重定向url
if(ret == CURLE_OK)
{long httpcode;curl_easy_getinfo(pcurl, CURLINFO_RESPONSE_CODE, &httpcode);if (httpcode == 301 || httpcode == 302){char *redirect_url = NULL;//1表示重定向次数,最多允许一次重定向curl_easy_setopt(pcurl, CURLOPT_FOLLOWLOCATION, 1);curl_easy_getinfo(pcurl, CURLINFO_REDIRECT_URL, &redirect_url);//if (redirect_url != nullptr)curl_free(redirect_url);}
}

完整测试demo:

struct CurlDownloadContext
{std::string redirect_url;CurlDownloadContext(){}~CurlDownloadContext(){}
};size_t HeaderCallback4Download(char *ptr,size_t size,size_t nmemb,void *userdata)
{//通过Location:获取重定向urlCurlDownloadContext* dld_ctx = (CurlDownloadContext*)userdata;const char key_loc[] = "Location:";if (_strnicmp(ptr, key_loc, strlen(key_loc)) == 0){dld_ctx->redirect_url.assign(ptr + strlen(key_loc));//去掉\r\nif (dld_ctx->redirect_url.size() > 2){dld_ctx->redirect_url.resize(dld_ctx->redirect_url.size() - 2);}}return size * nmemb;
}int _tmain(int argc, _TCHAR* argv[])
{curl_global_init(CURL_GLOBAL_ALL);CURL *pcurl = curl_easy_init();CurlDownloadContext dld_ctx;::curl_easy_setopt(pcurl, CURLOPT_URL, "http://weibo.com/");::curl_easy_setopt(pcurl, CURLOPT_HTTPGET, 1L);::curl_easy_setopt(pcurl, CURLOPT_CONNECTTIMEOUT, 30000L);::curl_easy_setopt(pcurl, CURLOPT_LOW_SPEED_TIME, 1800L);::curl_easy_setopt(pcurl, CURLOPT_LOW_SPEED_LIMIT, 10L);::curl_easy_setopt(pcurl, CURLOPT_SSL_VERIFYPEER, 0L);::curl_easy_setopt(pcurl, CURLOPT_SSL_VERIFYHOST, 0L);::curl_easy_setopt(pcurl, CURLOPT_NOSIGNAL, 1L);::curl_easy_setopt(pcurl, CURLOPT_HEADERFUNCTION, HeaderCallback4Download);::curl_easy_setopt(pcurl, CURLOPT_HEADERDATA, &dld_ctx);//::curl_easy_setopt(pcurl, CURLOPT_WRITEFUNCTION, WriteCallback4Download);//::curl_easy_setopt(pcurl, CURLOPT_WRITEDATA, &dld_ctx);CURLcode ret = ::curl_easy_perform(pcurl);long httpcode;curl_easy_getinfo(pcurl, CURLINFO_RESPONSE_CODE, &httpcode);if (httpcode == 301 || httpcode == 302){char *redirect_url = NULL;//1表示重定向次数,最多允许一次重定向curl_easy_setopt(pcurl, CURLOPT_FOLLOWLOCATION, 1);curl_easy_getinfo(pcurl, CURLINFO_REDIRECT_URL, &redirect_url);//if (redirect_url != nullptr)curl_free(redirect_url);}curl_global_cleanup();return 0;
}

重定向在线检测

libcurl重定向相关推荐

  1. libcurl 编程进度条和range请求源码示例

    在下面的源码中,我将展示如何使用libcurl提供的进度条功能,以及如何发送range请求, 同时提供了限速功能. 源码如下: //g++ -g curl_range.cpp -o curl_rang ...

  2. linux libcurl 库使用方法

    一.ibcurl简介 作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, I ...

  3. Using libcurl in VC++

    curl是瑞典curl组织开发的,Official Website: Introduction curl是一个基于命令行的应用工具,提供利用URL标准进行文件传输的功能. 目前已经支持非常多的流行的互 ...

  4. libcurl curl_easy_setopt函数以及设置选项

    使用此功能调用设置的选项对于使用此句柄执行的所有即将进行的传输均有效  .选项在传输之间不会有任何重置,因此,如果您希望使用不同选项进行后续传输,则必须在传输之间进行更改.您可以选择使用curl_ea ...

  5. http协议之https协议, libcurl实现人脸识别, 车牌识别

    原创: 冬冬他哥哥 链接: https://www.cnblogs.com/xietianjiao/p/13260021.html. http协议之https http协议详解 一.http协议的特性 ...

  6. C/C++编程:libcurl学习(linux + cmake windows10 + vs2019)

    curl与libcurl的关系 cURL是项目的名称.该名称是" URL的客户端"上的一个名称,最初是用大写的URL拼写的,以使其明显地处理URL cURL项目产生两种产品: li ...

  7. libcurl相关知识

    目录 一.libcurl背景说明 二.使用步骤 三.函数说明 四.curl_easy_setopt函数部分选项介绍 五.libcurl使用的HTTP消息头 七.多线程问题 八.HTTP验证 九.编译l ...

  8. libcurl实战-Get请求

    ibcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, ...

  9. libcurl库使用详情、libcurl库的制作

    文章目录 libcurl库的制作 1.libcurl简介: 2.下载libcurl库并制作自己的curl库 3.API说明 相关例子见官网:[example.html](https://curl.se ...

最新文章

  1. [BZOJ1260][CQOI2007]涂色paint 区间dp
  2. Git 合并分支选项 --squash 合并提交历史
  3. 零分钟即可在容器开发套件(CDK)上实现云运营
  4. UI控件之UISlider
  5. vm安装net失败_使用minikube安装kubernetes和dashboard
  6. HTML5七夕情人节表白网页制作 (浪漫的求婚动画) HTML+CSS+JavaScript
  7. 局域网电话软件系统功能与应用
  8. Pycharm快速入门(5) — Python解释器和环境配置
  9. 通过统计7万多真实人名生成可信的随机人名
  10. 学习了pr后的收获_我的PR小结
  11. windows快捷键失效 - 重启无效 - 插拔键盘解决
  12. ftp linux 推送文件_Linux文件传输FTP详解
  13. linux bam文件格式介绍,Sam和bam文件说明
  14. Oracle导出DMP文件的两种方法
  15. Vue Element正则验证(所有)
  16. 虚拟机启动时,提示找不到ISO映像文件
  17. 海康摄像头音频编码获取
  18. 工业机器人协作控制研究
  19. 吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--编程作业
  20. AdaBoost算法部分理论推导

热门文章

  1. 因聚而生 为你所能 | 华为伙伴暨开发者大会2022盛大召开
  2. Golang html转换图片,将HTML转换为图像
  3. 中国石油和化工标准与质量杂志社中国石油和化工标准与质量编辑部2022年第12期目录
  4. Android 实战项目 -- 登录主页、找回密码
  5. Derby数据库学习,derby、derby。derby入门。
  6. 2010年考研数学一解析
  7. 2019 前端面试题 (Vue)
  8. 从零开始的SpriteKit:视觉和音频效果
  9. java 农历节日 转公历日期_公历农历互相转换的Java日历工具类
  10. Leetcode——2053. 数组中第 K 个独一无二的字符串