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

Joe*_*oel 5 java url redirect http

尝试获取时,我从URLConnection获得了太多重​​定向重定向错误 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());
Run Code Online (Sandbox Code Playgroud)

输出可怕的:

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

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

任何想法为什么我的请求使用URLConnection /en/gb导致相同资源的另一个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());
Run Code Online (Sandbox Code Playgroud)

这输出:

Response code = 302
Redirected to /en/gb/
Run Code Online (Sandbox Code Playgroud)

因此无限重定向循环.

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

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

请求/en/gb/被重定向到/en/gb/恰好一次.

Laz*_*One 12

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

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

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

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