使cURL的行为与形式完全相同

时间:2009-12-06 16:18:36

标签: php curl

我的网站上有一个表单,它将数据发送到某个远程站点 - 简单的html表单。 我想要做的是使用数据用户输入表格进行统计。 因此,我不是将数据发送到远程页面,而是先将其发送到我的脚本,然后将其重新发送到远程站点。

问题是我需要它以完全相同的方式运行,通常的表单会将用户带到远程站点并显示资源。

当我使用这段代码时,它有点起作用,但不是我想要的方式:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $action);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
curl_close($ch);

问题是它在同一个脚本中显示响应。例如,如果$ action是例如: somesite.com/processform.php和我的脚本名称是mysqcript.php,它会在“mysqcript.php”中显示“somesite.com/processform.php”的响应,因此所有相关链接都不起作用。 如何将用户发送到“somesite.com/processform.php”?按下按钮会发生什么?

Leonti

3 个答案:

答案 0 :(得分:1)

我认为你必须在你的最后做到这一点,因为翻译相对路径是客户的工作。它应该很简单:只需获取您所做请求的基本目录

http://otherdomain.com/my/request/path.php

并将其添加到每个不以“/”或协议(“http://”,“ftp://”)开头的外发链接前面。

检测所有传出链接很难,但我100%确定有现成的PHP类可以做到这一点。检查示例this article和用户注释中的getLinks()函数。我不是百分之百确定这是否是你需要的,但它肯定会朝着正确的方向发展。

答案 1 :(得分:1)

以下是一些可能的解决方案,我单独发布,因此它们不会与我推荐的解决方案混淆:

1 - 继续使用cURL,解析响应并向其添加<base/> tag。它应该适用于该页面上的所有内容。

<base href="http://realsite.com/form_url.php" />

2 - 不要改变提交URL。将表单提交到真实URL,但使用一些Javascript库(YUI那样)捕获其内容并通过XHR将其发送到您的脚本。但它仍然是一种黑客。

答案 2 :(得分:0)

有几种方法可以做到这一点。这是最简单的方法之一:只需使用307重定向。

 header('Location: http://realsite.com/form_url.php', true, 307');

您可以在header()之前或之后进行日志记录和填充,但如果您在调用header()之后执行此操作,则需要使用

启动脚本
ignore_user_abort(true);

请注意,浏览器应该通知用户他们的表单正在被重定向。