使用 curl 请求 URL,该 URL 重定向到带有锚标记的相对 URL

使用 curl 请求 URL,该 URL 重定向到带有锚标记的相对 URL

我正在使用 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: /Error500 Server Error-I-Lhttp_code--write-out400

答案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 上却运行正常。因此,一定有一个错误修复或功能在两者之间解决了这个问题。如果有人知道确切的补丁或更改解决了这个问题,我将不胜感激!

相关内容