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

Java HTTP请求中的无限重定向循环,java,http,url,redirect,Java,Http,Url,Redirect,尝试获取www.palringo.com URL url = new URL("http://www.palringo.com/"); HttpURLConnection.setFollowRedirects(true); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); System.out.println("Response code = " + con

尝试获取
www.palringo.com

    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.com
www.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/
一次。

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


检查重定向规则。它们的定义是什么?在apache web服务器中还是在其他位置?全部检查。确认这是(或不是)一种情况,并相应地修改规则

问题出在服务器端。这可能是一个破坏的Apache httpd重写规则,该规则正在将该循环的重定向发送回同一位置。可能是别的原因。不管它是什么,您都不可能在客户端修复它


我基本上是在运行一个爬虫程序,刚刚注意到这个问题

这可能是一种反爬虫防御措施。“嗯……看起来像是那些讨厌的爬虫,他们忽略了我的robots.txt文件,浪费了我所有的带宽,偷走了我宝贵的内容。让我们用重定向循环给他带来一些痛苦吧!!”

检查您的爬虫程序是否遵守“robots.txt”协议。检查您正在爬网的站点的ToS,查看您所做的操作是否被允许

你可能是对的,但是如果是这样的话,为什么wget和浏览器只用一个重定向就可以处理这个问题呢

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


(我看到的)作者这样说:

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


可以说,对他们的网站进行爬网违反了这一点。

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

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

原因:服务器检查是否设置了cookie。如果未设置,则设置并重定向。由于不支持/禁用cookie,服务器端的脚本会一次又一次地重定向


解决方案:在代码中启用/添加cookie支持,然后重试。

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

恐怕我连接的不是我的服务器。我基本上是在运行一个爬虫程序,刚刚注意到这个问题。你可能是对的,但是如果是这样的话,为什么wget和浏览器只用一个重定向就可以处理这个问题呢?你知道wget和浏览器是如何处理这个问题的吗?他们可以从www.palringo.com/en/gb获取正确的内容?没有禁止爬虫的规定,而且wget工作正常。奇怪。如果我用Firefox头欺骗我的请求(来自另一个IP),我会得到同样的响应@史蒂芬:我假设robots.txt中的规则算作明示书面许可。若非如此,谷歌也将无法抓取它们,很明显,它们确实如此。@Joel-律师可能会告诉你其他情况。此外,Palringo可以选择对他们想要的大型网站索引者和正在收集内容的讨厌的人实施不同的ToS,以做不符合他们(Palringo)利益的事情。