HTTP请求中的无限重定向循环

时间:2011-07-19 11:04:48

标签: java http url redirect

尝试获取www.palringo.com时,我从URLConnection收到的重定向重定向错误太多了

    URL url = new URL("http://www.palringo.com/");      
    HttpURLConnection.setFollowRedirects(true);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    System.out.println("Response code = " + connection.getResponseCode());

输出可怕的:

Exception in thread "main" java.net.ProtocolException: Server redirected too many  times (20)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)

根据wget,只有一个重定向,从www.palringo.comwww.palringo.com/en/gb/

我的请求为/en/gb使用URLConnection的任何想法导致同一资源的另一个302响应?

问题的例子如下:

    URL url = new URL("http://www.palringo.com/en/gb/");        
    HttpURLConnection.setFollowRedirects(false);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    // Just for testing, use Chrome header, to eliminate "anti-crawler" response!
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30");
    System.out.println("Response code = " + connection.getResponseCode());

输出:

Response code = 302
Redirected to /en/gb/

因此是一个无限重定向循环。

有趣的是,虽然浏览器和wget处理它,但curl不会:

joel@bohr:/tmp$ curl http://www.palringo.com/en/gb/
curl: (7) couldn't connect to host

/en/gb/的请求被重定向到/en/gb/一次。

4 个答案:

答案 0 :(得分:12)

问题是你的HttpURLConnection(或者你使用的任何代码 - 抱歉,我不熟悉Java)不使用 cookies

在浏览器中禁用Cookie并观察完全相同的行为 - 无限重定向。

原因:服务器检查是否设置了cookie。如果没有设置 - 它设置它并重定向。由于不支持/禁用cookie,因此服务器端的脚本会反复重定向。

解决方案:为您的代码启用/添加Cookie支持,然后重试。

答案 1 :(得分:0)

我认为重定向的定义类似于/ * - > / EN / GB 因此,当您到达/ en / gb时,重定向规则再次起作用。

检查重定向规则。他们在哪里定义?在apache web服务器或其他地方?选择所有。验证这是(或不是)案例并相应地修复规则。

答案 2 :(得分:0)

问题出在服务器端。它可能是一个破坏的Apache httpd重写规则,它发送重定向循环回到同一个地方。它可能是别的东西。无论是什么,你都不太可能在客户端修复它。


  

我基本上运行了一个爬虫,只是注意到了这个问题。

它可能是一种反爬虫防御措施。 “嗯......看起来像是那些讨厌我的robots.txt文件的讨厌的爬虫之一,浪费了我所有的带宽并窃取了我的宝贵内容。让他在重定向循环中给他带来一些痛苦!”

检查您的抓取工具是否遵守“robots.txt”协议。检查您要抓取的网站的ToS,看看您正在做什么是允许的。

  

你可能是对的,但如果是这样的话,wget和浏览器如何通过一次重定向来处理这个问题?

可能是因为服务器正在查看请求标头,或者是您的请求模式。


Terms of Service(我看到)说:

“您同意不使用本服务:... xiii - 未经Palringo明确书面许可,出于任何目的运行任何自动化系统,流程,脚本或机器人。”

可以说,抓取他们的网站违反了这一点。

答案 3 :(得分:0)

如果您尝试连接到需要身份验证的服务,并且提供了错误的用户名和密码,也会出现此错误。