我正在使用curl来请求一个使用Location:行redirect到另一个URL的URL:
Location:/path/to/resource#name
据我了解,redirect响应中的那一行对于HTTP规范是无效的,所以整个curl调用可以理解地失败(在这种情况下,有一个400响应代码)。 但是,使用wget或Web浏览器请求URL成功呈现页面(我假设通过启发式填充绝对path或在redirect之前删除锚标记)。
有没有什么办法可以让curl做同样的事情(即使是“正式”畸形的成功地执行redirect也需要做什么?
编辑:一些更多的细节。 最终的响应代码是400(不是404或其他)。 当我做一个HEAD请求( curl -I -L ),我得到一个302 Found (与Location: /Error ),redirect到500 Server Error 。 但是,如果我做了一个常规的请求(没有-I选项,但有-L选项),我得到一个400的--write-out (curl的--write-out )。 所以在这种情况下HEAD请求看起来与标准GET不同。
据我了解,curl不会跟随位置标题默认情况下。
您可以使用-L或--location开关启用此类行为。 像这样:
tom@slappy:~▶ curl -I -L http://shell/redirect.php HTTP/1.1 302 Found Date: Tue, 17 Jan 2012 00:13:54 GMT Server: Apache/2.2.17 (Ubuntu) X-Powered-By: PHP/5.3.5-1ubuntu7.2 Location: /target.html#someAnchor Content-Type: text/html HTTP/1.1 200 OK Date: Tue, 17 Jan 2012 00:13:54 GMT Server: Apache/2.2.17 (Ubuntu) Last-Modified: Tue, 17 Jan 2012 00:10:37 GMT Accept-Ranges: bytes Content-Length: 7 Content-Type: text/html
注意: -I仅用于显示标题而不是页面内容。 我使用在Ubuntu上运行的curl 7.21.6来testing它。
我发现这个特殊的问题发生在curl7.15.5,但与curl7.21.0正常工作。 所以必须有解决它之间的错误修复或function。 如果有人确切地知道哪些补丁或更改解决这个问题,那将不胜感激!