WinInet - 如何在 301 重定向后获取服务器 URL

WinInet - How to obtain server URL after 301 redirect?

本文关键字:获取 服务器 URL 重定向 WinInet      更新时间:2023-10-16

我正在使用 WinInet 函数进行编程C++但我遇到了一个问题。

我的程序打开一个包含 HttpOpenRequest()HttpSendRequest()InternetReadFile() ...函数并保存输出数据。我需要保存带有输出数据的URL,但在某些情况下,服务器会给我301 MovedInternetReadFile()从新地址读取文件。

这没关系,但我需要找出它是什么地址。我试图将HttpQueryInfoHTTP_QUERY_RAW_HEADERS_CRLF一起使用,但我没有得到这些信息,只有Content-TypeCache-ControlCookies等。当我使用HTTP_QUERY_CONTENT_LOCATION或类似的东西时,我会ERROR_HTTP_HEADER_NOT_FOUND.

你可以帮我吗?

WinInet 收到重定向响应后,默认情况下会自动向新 URL 发送新的 HTTP 请求。 当 WinInet 准备好开始使用 InternetReadFile() 读取文件数据时,当时可用的标头属于请求的最后一个 URL,该 URL 可能与您最初请求的 URL 不同。 这就是为什么您看不到Location标题的原因。 要处理重定向响应的标头,您必须在调用 HttpOpenRequest() 时指定 INTERNET_FLAG_NO_AUTO_REDIRECT 标志,然后可以使用 HttpQueryInfo() 检测重定向状态代码并读取其Location标头,然后再调用 HttpSendRequest() 请求重定向到的新 URL。

当 wininet 中自动发生重定向时,您可以使用 InternetStatusCallback 函数获取重定向 URL。 代码 INTERNET_STATUS_REDIRECT (110) 将提供一个缓冲区,其中包含回调函数的新 URL。可以使用HINTERNET句柄上的InternetSetStatusCallback()来设置请求的回调函数。