当HttpWebResponse返回301但实际访问为404时,如何检测无效URL?
解决方案:检测重定向后最终URL的状态码
你的问题根源在于设置了AllowAutoRedirect = false,这会让请求在遇到301重定向时直接返回响应,不会自动跳转到目标地址——而实际返回404的是重定向后的URL,并非你最初请求的地址。要检测到最终的404状态,需要手动跟进重定向链,直到获取最终的响应状态。
具体处理逻辑
- 当收到3xx类状态码(301、302等)时,从响应的
Location头中提取重定向目标URL - 对目标URL发起新的请求,重复此过程,直到收到非3xx状态码或达到预设的重定向次数上限(避免无限循环)
- 根据最终的响应状态码判断URL是否有效
修改后的代码示例
public static bool IsUrlValid(string url, int maxRedirects = 5) { int redirectCount = 0; string currentUrl = url; while (redirectCount < maxRedirects) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(currentUrl); webRequest.Method = "HEAD"; webRequest.AllowAutoRedirect = false; try { using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse()) { // 处理重定向逻辑 if ((int)response.StatusCode >= 300 && (int)response.StatusCode < 400) { currentUrl = response.Headers["Location"]; // 处理相对路径转绝对路径的情况 if (!Uri.IsWellFormedUriString(currentUrl, UriKind.Absolute)) { Uri baseUri = new Uri(url); currentUrl = new Uri(baseUri, currentUrl).ToString(); } redirectCount++; } else { // 返回最终状态码的有效性判断 return ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 400; } } } catch (WebException ex) { // 捕获404这类错误状态(GetResponse遇到4xx/5xx会抛出异常) if (ex.Response is HttpWebResponse errorResponse) { return ((int)errorResponse.StatusCode) >= 200 && ((int)errorResponse.StatusCode) < 400; } // 其他异常(如无法连接)视为URL无效 return false; } } // 超过最大重定向次数,视为无效 return false; } // 使用示例 bool isValid = IsUrlValid("https://www.trasportale.it/categoria_construction/in-cava/");
关键细节说明
- 新增
maxRedirects参数限制重定向次数,防止陷入网站配置的循环重定向 - 处理了
Location头可能为相对路径的情况,自动拼接为绝对URL - 通过捕获
WebException来处理404这类错误状态,避免程序崩溃
内容的提问来源于stack exchange,提问作者Makis
相关产品推荐
相关产品推荐

