如何使用PHP加载完整的网页

时间:2017-07-20 18:19:02

标签: php php-curl

有很多这样的问题,但是这些建议没有帮助。我使用PHP的cURL访问我们公司的n-able数据库。 n-able Web界面不是n-central服务器,而是n-able提供的服务器。

我正在开展一个项目,将我们的网络服务(如Ubiquiti和N-able)整合到一个自定义的仪表板中,而不是浏览七个不同的网站。 Unifi拥有自己的API,效果很好。 N-able在API实现上有一些尝试,我已经检查过,尝试过并且失败了。

以下是项目:

github.com/N-able/API

https://github.com/Daandamhuis/N-Able-Dashboard

尝试使用PHP和cURL访问ncod51.n-able.com页面时,只加载页面底部:

Test of website access

<?php

$url="https://ncod51.n-able.com"; 

//traverse array and prepare data for posting (key1=value1)
foreach ( $post_data as $key => $value) {
    $post_items[] = $key . '=' . $value;
}
//create the final string to be posted using implode()
$post_string = implode ('&', $post_items);
$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url.'/IndexAction.action'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 
5.1; 
en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_REFERER, $url.'loginLoginAction.action'); 
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $post_string); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch);
    if (!$result) { 
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
        curl_close($ch); // make sure we closeany current curl sessions 
        die($http_code.' Unable to connect to server. Please come back later.'); 
} 
echo $result; 
?>

实际应用程序无法加载。现在的目标是从n-able站点获取信息并将其加载到我们正在使用当前的Wamp服务器实现的php创建的接口上。

如果需要任何其他信息,请与我们联系。这是唯一正在使用的php文件,直到我可以访问。

非常感谢任何帮助!

注意:n-able站点是https站点。

1 个答案:

答案 0 :(得分:0)

做的时候

foreach ( $post_data as $key => $value) {
    $post_items[] = $key . '=' . $value;
}

当键或值包含=字符时会发生什么?假设你的$ key是foo=bar,而你的$值是baz=lel&what,你最终会得到foo=bar=baz=lel&what,这是非法的urlencoding,不要指望服务器理解它。实际上,期望服务器以HTTP 400 Bad Request响应进行响应,因为这是一个错误的请求。正确的编码为foo%3Dbar=baz%26lel,您在空格<>以及&ÆØÅ以及其他一些字符时遇到同样的问题。解决这个问题,你可以做$post_items[] = urlencode($key) . '=' . urlencode($value); - 或者更好,用http_build_query对整个字符串进行编码,这就是它存在的原因。实际上,这个编码代码

foreach ( $post_data as $key => $value) {
    $post_items[] = urlencode($key) . '=' . urlencode($value);
}
$post_string = implode ('&', $post_items);

可以替换为这一行:

$post_string=http_build_query($post_items);

那样做。另外,在调试curl代码时,启用CURLOPT_VERBOSE,它会打印许多有用的调试信息。

但你说只有页面底部加载?在curl和firefox中发布两个标题(由CURLOPT_VERBOSE打印)和加载页面的响应html,可能存在一些线索(如标题中的http错误代码?或者页面的其余部分是在html中用javascript加载?)