当我得到一个包含cURL请求的页面时,如果路径是相对的,如何导航页面?

时间:2012-03-09 05:51:50

标签: php curl

这可能是一个简单的问题,但我找不到答案......我有一个名为'send.php'的PHP脚本,它发出了一个打开外部网页的cURL请求。它将外部页面输出到浏览器。完全靠书本。

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);

它只是将一些POST数据发布到外部站点上的处理脚本,然后在浏览器上显示外部脚本正常显示的内容;即确认信息,谢谢等等。

问题是:我的'send.php'仍然是导航栏中显示的网址。因此,如果我在该页面上单击并且链接使用相对路径,它会尝试使用这些相对路径附加当前路径,这当然会导致404.此外,如果页面上有更多表单域,并且操作路径是一个空字符串,它会尝试在我的服务器上再次将这些提交发送到send.php,然后生成错误。

如何才能使它仍然发送帖子数据并输出处理脚本的结果,但仍然允许用户像往常一样导航输出页面?或者,如果它是一个多页表单,他们可以继续填写第2页,就像它们只是在该网站上一样?

提前致谢

更新:通过在上面的代码中添加以下代码来解决:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$response = str_ireplace('<head>', "<head><base href=\"$url\" />", $response);
echo $response;

3 个答案:

答案 0 :(得分:1)

我可能会到达这里

$url = "http://example.com";
$url2 = "http://www.example.com";
$url3 = "https://example.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$text = curl_exec($ch);

$text = str_replace("href=\"$url","href=\"",$text);
$text = str_replace("href=\"$url2","href=\"",$text);
$text = str_replace("href=\"$url3","href=\"",$text);
$text = str_replace("href=\"","href=\"$url",$text);
echo "$text";
curl_close($ch);

答案 1 :(得分:1)

您可以获取curl解析为的URL(如果您使用curl_getinfoCURLINFO_EFFECTIVE_URL的FOLLOWLOCATION。您可以将此URL添加到所有相对路径。至于如何判断是否路径相对..好吧..如果它以'/'开头它是绝对的,这实际上使它与域“相对”。如果它以一个方案开始,它也是绝对的,它甚至可能导致一个不同的域。

至于如何查找网址..您可以使用DOMDocument::loadHTML并使用DOMXPath查找所有锚标记(或link s,如果你喜欢)。想想Google工程师为网站抓取和网址跟踪支付了多少钱 - 这可能不是世界上最简单的做法。

答案 2 :(得分:0)

是否有某些原因您不能将您的页面从客户端直接发布到其他服务器?当您只想将用户重定向到另一个页面时,为什么要使用cURL?

<form action="https://other.server.com/url" method="post">
    <!-- if the data has been previously collected and isn't being entered right now by the user... -->
    <?php foreach ($postdata as $key => $val) { ?>
    <input type="hidden" name="<?= $key; ?>" value="<?= $val; ?>">
    <? } ?>
</form>