网页重定向如何在此页面中工作?

时间:2013-08-13 12:57:33

标签: java javascript url redirect jsoup

我正在尝试从此页面检索链接:http://www.seas.harvard.edu/academics/areas

页面中间有一个名为“Computer Science”的链接。它的基础链接是“/学术/领域/计算机科学”。我可以使用Java内置URL类将其转换为绝对URL,获取“http://www.seas.harvard.edu/academics/areas/computer-science”。

但是,当我点击Chrome浏览器中的链接时,绝对网址会更改为“http://www.seas.harvard.edu/computer-science”。

所以我的问题是双重的:

  1. 此页面中的网址重定向如何工作?
  2. Java中是否有任何库或方法可以帮助我在重定向后获取URL?
  3. 我需要在重定向后获取URL,因为我想阅读页面的源代码,但重定向之前的URL对我不起作用。我正在使用JSoup库来读取URL,因此我怀疑它可能是基于javascript的重定向。

5 个答案:

答案 0 :(得分:4)

curl --dump-header [file] [URL]文件看起来像:

HTTP/1.1 301 Moved Permanently
Age: 0
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html
Date: Tue, 13 Aug 2013 13:00:12 GMT
ETag: "1376398812"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 13 Aug 2013 13:00:12 GMT
Location: http://www.seas.harvard.edu/computer-science
Server: nginx
Vary: Accept-Encoding
Via: 1.1 varnish
X-AH-Environment: prod
X-Cache: MISS
X-Drupal-Cache: MISS
X-Redirect-ID: 44
X-Varnish: 2704315535
transfer-encoding: chunked
Connection: keep-alive

如您所见,这是从服务器提供的301永久重定向。

获取数据:

您可以使用HttpURLConnection进行连接,但在连接之前,请致电myConn.setInstanceFollowRedirects(true)。遵循重定向,您可以获取输出流并阅读它。

要获取URL本身:

您可以使用HttpURLConnection进行连接,但在连接之前,请致电myConn.setInstanceFollowRedirects(false)而不是,然后重定向。这会将实际的URL保存在正确的位置。

这里的诀窍是,由于某些奇怪的原因,HttpURLConnection不允许通过 name 检索标头,除非您将其解析为日期。

因此,您需要迭代一个整数,在建立连接后调用getHeaderFieldKey并检查它是否等于Location,如果是,则将getHeaderField与相同的整数相加得到位置。很烦人,我知道。但是,地点不是日期,这是JRE的疏忽。

答案 1 :(得分:0)

我使用Fiddler进行调查,网站返回链接http://www.seas.harvard.edu/academics/areas/computer-science HTTP 301 response code,执行重定向。

我想获得真实的网址。您应该对harvard.edu Web服务器执行实际请求并解析响应。 (重定向URL位于HTTP标头中的Location键中。)

对你的第二个问题感到抱歉。我没有Java技能。

这个SO问题可能有所帮助(httpclient-4-how-to-capture-last-redirect-url

答案 2 :(得分:0)

  1. 可能有例如一个.htaccessmod_rewrite重定向。使用Firefox的控制台我可以看到请求。如下所示,服务器正在发送301 Moved Permanently消息。这告诉浏览器重定向到响应的Location标头中返回的地址。 The web requests
  2. 获取更改后的URL的方式取决于加载页面的方式:
    • 如果您使用现成的库&用于将页面加载到例如的代码一个DOM对象,您可以使用该现成的HTTP系统加载响应,这可能会导致它自动重定向 - >您将从加载页面的URL获取URL。如果不这样做,那么您必须检查状态代码301或302,当收到这些代码时,更改后的URL位于响应的Location标题中。
    • 如果您编写自己的代码以通过TCP套接字加载响应,那么您必须正常加载响应,但再次检查301和302状态代码,并按照上一节中的说明进行操作。

答案 3 :(得分:0)

我只能尝试解决Q1,因为我不是Java程序员。源代码说他们正在使用Drupal,所以我推测他们正在使用Drupal的global redirect module(关于Drupal重定向模块here的SO讨论)。查看模块的文档可能会说明如何使用Java获取正确的URL。

javascript中还有许多方法可以让网址请求自动重定向到某个基页(例如,CS主页),而物理导航网站则允许用户前进到新页面。这是许多单页Web应用程序中的标准做法。如果是这种情况,那么@hexafraction的建议可能会帮助您检索所需的URL,尽管我不熟悉他建议的Java方法。

答案 4 :(得分:0)

您可以从以下代码设置Redirect URL获取followRedirectsfalse

如果您将重定向页面设置为true,那么您将获得重定向页面的源代码,这是Jsoup的默认行为

 Connection con = Jsoup.connect("http://www.seas.harvard.edu/academics/areas/computer-science")
                              .userAgent("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36")
                              .followRedirects(false);

           System.out.println("Redirected Url : " + con.execute().header("Location")); //null if followRedirect is true

           Document doc = con.get();
           System.out.println(doc.html());
           System.out.println("=================================================");