猿问

具有相同请求标头的 BASH cURL 和 PHP cURL 的不同响应

这是一个非常有趣的问题。


我正在为微型网络广播播放器编写 API。为了获得当前曲目,我正在解析演员服务器前端。


在http://deepmix.ru的示例中,这是一个 SHOUTcast 1.x 服务器,我能够解析 URI http://85.21.79.31:7128/played.html。


当我在 FireFox 中请求 URI 时,我得到显示播放曲目列表的网页。如果我从托管 API 的服务器的 BASH 请求带有 cURL 的 URI,我会得到该服务器的 404。


$ curl -v -G http://85.21.79.31:7128/played.html

*   Trying 85.21.79.31...

* Connected to 85.21.79.31 (85.21.79.31) port 7128 (#0)

> GET /played.html HTTP/1.1

> Host: 85.21.79.31:7128

> User-Agent: curl/7.47.0

> Accept: */*

ICY 404 Resource Not Found

icy-notice1:<BR>SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>

icy-notice2:The resource requested was not found<BR>


* Connection #0 to host 85.21.79.31 left intact

我认为适当的用户代理可以帮助并添加Mozilla以接收网页。所以这奏效了。


$ curl -v -A "Mozilla" -G http://85.21.79.31:7128/played.html

*   Trying 85.21.79.31...

* Connected to 85.21.79.31 (85.21.79.31) port 7128 (#0)

> GET /played.html HTTP/1.1

> Host: 85.21.79.31:7128

> User-Agent: Mozilla

> Accept: */*

* HTTP 1.0, assume close after body

< HTTP/1.0 200 OK

< content-type:text/html

<HTML>[...]<title>SHOUTcast Administrator</title>[...]</HEAD><BODY topmargin=0 leftmargin=0 marginheight=0 marginwidth=0 bgcolor=#000000 text=#EEEEEE link=#001155 vlink=#001155 alink=#FF0000><font class=default><table width=100% border=0 cellpadding=0 cellspacing=0><tr><td height=50><font class=logoText>&nbsp;SHOUTcast Song History</font></td></tr><tr><td height=14 align=right><font class=ltv><a id=ltv href="http://www.shoutcast.com/">SHOUTcast Server Version 1.9.8/Linux</a>[...]</body></html>

根据我的发现,我将请求转移到我的 PHP cURL 实现中。


$curlHandler = curl_init();

curl_setopt_array(

    $curlHandler,

    [

        CURLINFO_HEADER_OUT     => true,

        CURLOPT_URL             => 'http://85.21.79.31:7128/played.html',

        CURLOPT_CUSTOMREQUEST   => 'GET',

        CURLOPT_USERAGENT       => 'Mozilla',

        CURLOPT_RETURNTRANSFER  => true,

        CURLOPT_HEADER          => false,

        CURLOPT_NOBODY          => true

    ]

);


在比较请求标头时,没有区别。所以我假设我看不到 BASH 和 PHP 的 cURL 实现之间存在差异。


那么这里会发生什么呢?


RISEBY
浏览 197回答 1
1回答

ITMISS

这是我自己的一个很大的错误。首先,我将其留CURLOPT_NOBODY => true在代码中(请参阅问题),这会导致空响应。其次,我留file_get_contents( $uri )在了我的代码中,这导致了问题中发布的警告。总之,在删除这些时,两个 cURL 都按预期工作。
随时随地看视频慕课网APP
我要回答