这是一个非常有趣的问题。
我正在为微型网络广播播放器编写 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> 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 实现之间存在差异。
那么这里会发生什么呢?
ITMISS