我们有一个“遗留”脚本不久前停止工作。很确定这是因为它连接的端点从 http 更改为 https,并且旧的 http 地址现在返回 301。
除了对 PHP 脚本进行微小的更改之外,我从未做过任何其他事情,所以我在这里有点力不从心。
请注意,我们的 PHP 版本是旧版本 - 5.3.0。这很可能是问题的一部分。
脚本原样(无论如何相关位):
$uri = "http://www.imf.org/external/np/fin/data/rms_mth.aspx"
."?SelectDate=$date&reportType=CVSDR&tsvflag=Y";
$opts = array('http' => array(
'proxy' => 'tcp://internal.proxy.address:port',
'method' => 'GET',
'request_fulluri' => true)
);
$ctx = stream_context_create($opts);
$lines = file($uri, false, $ctx);
foreach ($lines as $line)
...
这不再返回任何内容。顺便说一下,链接是 IMF 汇率链接,所以它对所有人开放——如果你打开它,你会得到一个包含汇率表的下载。脚本的其余部分基本上解析了我们想要的数据。
现在,很确定我们的代理没问题。使用 curl 运行一些测试会得到以下结果:
curl --proxy tcp://internal.proxy.address:port -v https://www.imf.org/external/np/fin/data/rms_mth.aspx?SelectDate=05/28/2020&reportType=CVSDR&tsvflag=Y
(指定 https)工作得很好。
curl --proxy tcp://internal.proxy.address:port -v http://www.imf.org/external/np/fin/data/rms_mth.aspx?SelectDate=05/28/2020&reportType=CVSDR&tsvflag=Y
(指定 http)不起作用,并显示 301 错误
curl --proxy tcp://internal.proxy.address:port -v -L http://www.imf.org/external/np/fin/data/rms_mth.aspx?SelectDate=05/28/2020&reportType=CVSDR&tsvflag=Y
(指定带有跟随重定向的 http)然后工作正常。
经过一些谷歌搜索后,我尝试了一些事情。在使用 https 时,我似乎也需要选择“ssl”。所以我做了以下更改
$uri = "https://www.imf.org/external/np/fin/data/rms_mth.aspx"
."?SelectDate=$date&reportType=CVSDR&tsvflag=Y";
$opts = array('http' => array(
'proxy' => 'tcp://internal.proxy.address:port',
'method' => 'GET',
'request_fulluri' => true),
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'SNI_enabled' => false)
);
可悲的是,这个SNI_enabled标志是在 5.3.0 之后引入的,所以我认为这没有帮助。http还有一个follow_locationcontext选项,不过是5.3.4引入的,所以也没用。
(顺便说一句,我几乎无法控制我们拥有的 PHP 版本,所以虽然我很欣赏更高版本可能会提供更好的解决方案,但恐怕这对我来说用处不大)。
基本上,我现在被困住了。这些参数或设置的组合根本不会返回任何数据。我可以看到它通过 curl 和代理工作,所以这不是一般的连接问题。
非常感谢收到任何和所有建议!
紫衣仙女