我正在使用 curl 请求一个 URL,该 URL 使用Location:
如下行重定向到不同的 URL:
Location:/path/to/resource#name
据我了解,重定向响应中的该行不符合 HTTP 规范,因此整个 curl 调用失败是可以理解的(在本例中,响应代码为 400)。但是,使用 wget 或 Web 浏览器请求 URL 可以成功呈现页面(我假设通过启发式方法在重定向之前填写绝对路径或删除锚标记)。
我能做些什么来让 curl 做同样的事情(做成功遵循重定向所必需的事情,即使它“正式”格式错误)?
编辑:更多细节。最终响应代码是 400(不是 404 或其他代码)。当我执行 HEAD 请求(带有curl -I -L
)时,我得到一个重定向到 的302 Found
(带有) 。但是,如果我执行常规请求(没有选项但带有选项),我得到一个(在 curl 中)的。因此,在这种情况下,HEAD 请求的功能似乎与标准 GET 不同。Location: /Error
500 Server Error
-I
-L
http_code
--write-out
400
答案1
据我了解,curl 默认不遵循 Location 标头。
您可以使用-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 对此进行了测试。
答案2
我发现这个特定问题出现在 curl 7.15.5 上,但在 curl 7.21.0 上却运行正常。因此,一定有一个错误修复或功能在两者之间解决了这个问题。如果有人知道确切的补丁或更改解决了这个问题,我将不胜感激!