使用Curl / HttpClient重定向:标题“位置”丢失

时间:2009-10-27 17:24:30

标签: java redirect http-headers http-status-code-302 apache-commons-httpclient

当我使用 curl

获取以下网址时
curl -D headers.http "http://www.springerlink.com/index/10.1007/s00453-007-9157-8"

文件headers.http包含一个“Location”标题:

HTTP/1.1 302 Found
Date: Tue, 27 Oct 2009 17:00:20 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Location: http://www.springerlink.com/link.asp?id=c104731297q64224
Set-Cookie: CookiesSupported=True; expires=Wed, 27-Oct-2010 17:00:20 GMT; path=/
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 173

但是当我使用apache httpclient库时,这个“Location:”标题丢失了(?)。

int status = httpClient.executeMethod(method);
if(status!=HttpStatus.SC_OK &&
status!=HttpStatus.SC_MOVED_TEMPORARILY &&
status!=HttpStatus.SC_MOVED_PERMANENTLY
    )
    {
    throw new IOException("connection failure for "+url+" status:"+status);
    }
Header header=method.getResponseHeader("Location");
if(header==null )
    {

    for(Header h:method.getResponseHeaders())
        {
        LOG.info(h.toString());
        }

    throw new IOException(
        "Expected a redirect for "+url
        );
    }

我列出了以下标题:

INFO: Date: Tue, 27 Oct 2009 17:05:13 GMT
INFO: Server: Microsoft-IIS/6.0
INFO: X-Powered-By: ASP.NET
INFO: X-AspNet-Version: 2.0.50727
INFO: Set-Cookie: ASP.NET_SessionId=js1o5wqnuhuh24islnvkyr45; path=/; HttpOnly
INFO: Cache-Control: private
INFO: Content-Type: text/html; charset=utf-8
INFO: Content-Length: 17245

嗯???

3 个答案:

答案 0 :(得分:2)

发生了什么事情,curl,您获得的302实际上是重定向到位置标题中的网址。

使用Apache httpclient,它正在为您执行重定向,并将请求中的标头返回到重定向到的位置。

要演示此尝试

curl -D headers.http "http://www.springerlink.com/link.asp?id=c104731297q64224"

并比较回应。

编辑:如果您通过curl跟踪每个位置标题,那么实际上大约有4个重定向。

答案 1 :(得分:0)

http://www.springerlink.com/index/10.1007/s00453-007-9157-8实际上是重定向。由于-D选项仅表示“标题”,因此第一个选项不会重定向到指定的Location: ...,而第二个选项则不是。看看内容长度,它有很大的不同。

当您遗漏-D时会发生什么?

答案 2 :(得分:0)

添加此

  method.setFollowRedirects(false); 

在执行方法之前。

默认情况下,HttpClient会自动跟随重定向,但Curl不会。