从原始 URL 获取重定向 URL

2024-05-05

我的数据库中有一个表,其中包含一些网站的 URL。我必须打开这些 URL 并验证这些页面上的一些链接。问题是某些 URL 被重定向到其他 URL。对于这样的 URL,我的逻辑是失败的。

有什么方法可以传递原始 URL 字符串并获取重定向的 URL?

示例:我正在尝试使用以下 URL:http://individual.troweprice.com/public/Retail/xStaticFiles/FormsAndLiterature/CollegeSavings/trp529Disclosure.pdf http://individual.troweprice.com/public/Retail/xStaticFiles/FormsAndLiterature/CollegeSavings/trp529Disclosure.pdf

它被重定向到这个:http://individual.troweprice.com/staticFiles/Retail/Shared/PDFs/trp529Disclosure.pdf http://individual.troweprice.com/staticFiles/Retail/Shared/PDFs/trp529Disclosure.pdf

我尝试使用以下代码:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Uris);
req.Proxy = proxy;
req.Method = "HEAD";
req.AllowAutoRedirect = false;

HttpWebResponse myResp = (HttpWebResponse)req.GetResponse();
if (myResp.StatusCode == HttpStatusCode.Redirect)
{
  MessageBox.Show("redirected to:" + myResp.GetResponseHeader("Location"));
}

当我执行上面的代码时,它给了我HttpStatusCodeOk。我很惊讶为什么它不认为这是一个重定向。如果我在 Internet Explorer 中打开该链接,它将重定向到另一个 URL 并打开 PDF 文件。

有人可以帮助我理解为什么示例 URL 无法正常工作吗?

顺便说一下,我检查了 Hotmail 的 URL(http://www.hotmail.com http://www.hotmail.com) 并且它正确返回重定向的 URL。


该函数将返回链接的最终目的地——即使有多个重定向。它不考虑基于 JavaScript 的重定向或 META 重定向。请注意,之前的解决方案没有处理绝对和相对 URL,因为 LOCATION 标头可能返回类似“/newhome”的内容,您需要与提供该响应的 URL 结合起来以识别完整的 URL 目标。

    public static string GetFinalRedirect(string url)
    {
        if(string.IsNullOrWhiteSpace(url))
            return url;

        int maxRedirCount = 8;  // prevent infinite loops
        string newUrl = url;
        do
        {
            HttpWebRequest req = null;
            HttpWebResponse resp = null;
            try
            {
                req = (HttpWebRequest) HttpWebRequest.Create(url);
                req.Method = "HEAD";
                req.AllowAutoRedirect = false;
                resp = (HttpWebResponse)req.GetResponse();
                switch (resp.StatusCode)
                {
                    case HttpStatusCode.OK:
                        return newUrl;
                    case HttpStatusCode.Redirect:
                    case HttpStatusCode.MovedPermanently:
                    case HttpStatusCode.RedirectKeepVerb:
                    case HttpStatusCode.RedirectMethod:
                        newUrl = resp.Headers["Location"];
                        if (newUrl == null)
                            return url;

                        if (newUrl.IndexOf("://", System.StringComparison.Ordinal) == -1)
                        {
                            // Doesn't have a URL Schema, meaning it's a relative or absolute URL
                            Uri u = new Uri(new Uri(url), newUrl);
                            newUrl = u.ToString();
                        }
                        break;
                    default:
                        return newUrl;
                }
                url = newUrl;
            }
            catch (WebException)
            {
                // Return the last known good URL
                return newUrl;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                if (resp != null)
                    resp.Close();
            }
        } while (maxRedirCount-- > 0);

        return newUrl;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从原始 URL 获取重定向 URL 的相关文章

随机推荐

  • 用 ruby​​ 解决旅行商问题(50 多个位置)

    我在一家快递公司工作 目前 我们 手动 解决了 50 多个地点的路线 我一直在考虑使用 Google Maps API 来解决这个问题 但我读到有 24 点的限制 目前我们在服务器中使用 Rails 因此我正在考虑使用 ruby 脚本来获取
  • 删除 hive 表中的列

    我正在使用 hive 版本 0 9 我需要删除 hive 表的列 我在几个 hive 命令手册中进行了搜索 但我只找到了 0 14 版本的命令 在 hive 0 9 版本中可以删除 hive 表的一列吗 命令是什么 谢谢 我们不能简单地使用
  • Android 多用户支持(4.2 中的新功能)对服务器端数据模型(例如 android_id)的影响

    Google 刚刚发布了 Android 4 2 其中支持单个设备上的多个用户配置文件 http developer android com about versions android 4 2 html MultipleUsers htt
  • 始终启动没有历史记录的新活动实例

    有没有办法将活动作为没有历史记录的新实例启动 在清单文件中尝试了以下内容 android launchmode singleinstance android noHistory true 我能够实现我所需要的 但是一旦屏幕锁定 就会显示之前
  • SQL 连接表

    表一包含 ID Name 1 Mary 2 John 表二包含 ID Color 1 Red 2 Blue 2 Green 2 Black 我想结束的是 ID Name Red Blue Green Black 1 Mary Y Y 2 J
  • 将 2D 数组中的每一列与另一个 2D 数组中的每一列相乘

    我有两个 Numpy 数组x有形状 m i and y有形状 m j 所以行数是相同的 我想将每一列相乘x每一列y逐元素 使结果具有形状 m i j Example import numpy as np np random seed 1 x
  • SoapHttpClientProtocol:以流而不是字符串的形式获取响应?

    我正在使用一种网络服务 它可以一次性输出大量数据 响应字符串可能约为 8MB 虽然在台式电脑上这不是问题 但嵌入式设备在处理 8MB 字符串对象时会发疯 我想知道是否有办法以流的形式获取响应 目前我正在使用如下方法 我尝试使用 POST 请
  • 从 BLOB 打印 PDF

    我从外部 API 获取 PDF 文件 使用此代码我可以正确下载该文件 var req new XMLHttpRequest req open POST url true req responseType blob req setReques
  • 对话框结果 WPF

    我正在读一本书 上面写着 而不是设置 DialogResult 用户点击后手动 按钮 您可以将按钮指定为 接受按钮 通过设置 是默认为true 点击那个 按钮自动设置 窗口的DialogResult为true 同样 你可以指定一个按钮 作为
  • 如何在 python pandas 中的同一列上进行分组并将唯一值的计数和某些值的计数作为聚合?

    我的问题与我之前的问题有关Question https stackoverflow com questions 42022767 how to do group by and take count of one column divide
  • 使用 std::set 时重载运算符<

    这是我第一次使用 std set 容器 并且我对操作符 std less 遇到了问题 我声明该集合 std set
  • Mongoose MongoDB:更新嵌套数组中的对象

    我有以下架构 var UserSchema new Schema emp no Number skills skill type Schema Types ObjectId ref Skill startDate type Date 然后我
  • 使用 JavaScript 在空闲时隐藏鼠标光标

    是否可以使用JavaScript来设置cursor属性的属性none如果鼠标在一定时间内处于非活动状态 例如五秒 请将其设置回auto当它再次活跃时 EDIT 我意识到none不是有效值cursor财产 尽管如此 许多网络浏览器似乎都支持它
  • 领域驱动设计:处理原子操作和事务

    必须保证每个聚合内部的一致性 在存储库中执行此操作很容易 因为我始终可以使用数据库或框架中的事务 我对存储库之外发生的事情表示怀疑 一项服务可能需要使用多个聚合来处理请求 在服务处理过程中或在保留聚合时可能会出现问题 如果服务处理过程中出现
  • 如何生成满足某些限制的整数?

    任何人都可以帮我提供生成满足某些限制的整数的技术吗 例如 假设我需要生成整数 x 和 y 使得 100 gt x and y lt x 5 我指的并不是这个特定的示例 而是一些生成满足某些条件的整数的通用技术 嗯 这并不难 选择一个整数 可
  • 自动调整“非视网膜”图像版本的大小

    我正在寻找一种解决方案 可以使我免于维护同一图像的两个版本 一个用于视网膜显示器 又名 2x 另一个用于非视网膜显示器 我的目标是仅维护 2x 图像 并使用一些 神奇工具 只需单击一下即可调整所有图像的大小 甚至在 XCode 中构建时效果
  • 如何为Spring测试创建TestContext?

    我有一个相对较小的 Java 库 它实现了几十个 bean 没有数据库或 GUI 我创建了一个 Spring Bean 配置文件 其他 Java 项目使用该文件将我的 bean 注入到他们的东西中 我现在第一次尝试使用 Spring Tes
  • 在 Android 中使用新的“manifestmerger”属性

    在最新版本的 ADT 版本 20 预览版 3 中 他们说可以使库的清单文件与使用它们的项目合并 自动将库项目清单文件合并到包含文件中 项目的清单 使用manifestmerger enabled 属性启用 我如何以及在哪里使用它 我在任何地
  • 错误 ITMS-90168:“您上传的二进制文件无效。”

    我正在尝试将应用程序上传到 App Store 它包含一个 watchOS 2 应用程序 watchOS 1 扩展和一些 iOS 扩展 我不明白为什么会发生这种情况 当我使用 Xcode 7 的 上传到 App Store 功能 或使用应用
  • 从原始 URL 获取重定向 URL

    我的数据库中有一个表 其中包含一些网站的 URL 我必须打开这些 URL 并验证这些页面上的一些链接 问题是某些 URL 被重定向到其他 URL 对于这样的 URL 我的逻辑是失败的 有什么方法可以传递原始 URL 字符串并获取重定向的 U