如何获取重定向页面的地址?

时间:2012-03-14 19:25:28

标签: c# web

我的程序的目标是获取一个网页,然后生成一个绝对链接列表及其链接到的页面。

我遇到的问题是当一个页面在没有程序知道的情况下重定向到另一个页面时,会使所有相关链接出错。

例如:

我给我的程序这个链接: moodle.pgmb.si/moodle/course/view.php?id=1

在此页面上,如果它在当前目录中找到链接href =“ signup.php ”表示signup.php,则会出错,因为根目录上方没有目录。

但是此错误无效,因为页面的真实位置是:
moodle.pgmb.si/moodle/login/index.php

意思是“signup.php”链接到 moodle.pgmb.si/signup.php 这是一个有效页面,而不是 moodle.pgmb.si/moodle/course/signup .php 就像我的程序一样。

所以我的问题是我的程序应该如何知道它收到的页面是在另一个位置?

我在C Sharp中使用follownig代码来获取HTML

WebRequest wrq = WebRequest.Create(address);
WebResponse wrs = wrq.GetResponse();
StreamReader strdr = new StreamReader(wrs.GetResponseStream());
string html = strdr.ReadToEnd();
strdr.Close();
wrs.Close();

3 个答案:

答案 0 :(得分:2)

我要做的是首先通过搜索" http://"来检查每个链接是绝对的还是相对的。在其中。如果它是绝对的,那么你就完成了。如果它是相对的,那么您需要将路径附加到您正在其前面扫描的页面。

您可以通过多种方式获取当前路径:您可以在斜杠上Split()(" /"),然后重新组合除最后一个之外的所有路径。或者你可以搜索斜杠的最后一次出现,然后取一个子串到达并包括该位置。

修改:重新阅读问题,我不确定我是否理解。 href="signup.php"是一个相对链接,应该转到/signup.php。所以你提到的当前行为是正确的" moodle.pgmb.si/moodle/course/signup.php。"

答案 1 :(得分:2)

问题是,如果URL不是相对或绝对URL,那么除非您提出请求,否则您无法知道它的去向。即便如此,它实际上可能并不是从你认为它所在的地方提供的。这是因为它实际上可能实现为HTTP Redirect或类似的服务器端。

所以,如果你想要详尽无遗,你可以做的是:

  1. 使用您当前的技术获取页面上所有链接的列表。
  2. 尝试请求每个页面。如果你:
    1. 获得200个响应代码然后一切都很好 - 就在那里。
    2. 获取您知道页面不存在的404响应代码
    3. 获取3XX response代码,然后您知道Web服务器的位置 期望内容实际上是一种形式。
  3. 您的(Http)WebResponse对象应具有ResponseCode属性。请注意,您还应该处理任何可能的WebException错误 - 这些错误也会包含一个带有ResponseCode的WebResponse(通常为5xx)。

    您还可以查看HttpWebResponse Headers属性 - Location标题。

答案 2 :(得分:2)

您应该能够使用WebResponse类的ResponseUri方法。这将包含实际提供响应数据的Internet资源的URI,而不是所请求的资源。然后,您可以使用此URI来构建正确的链接。

http://msdn.microsoft.com/en-us/library/system.net.webresponse.responseuri.aspx