【问题标题】:How I can do HTTP post to a url called by an Iframe我如何将 HTTP 发布到 Iframe 调用的 url
【发布时间】:2011-03-30 20:26:28
【问题描述】:

我想使用 php 向外部 url 发布 http 帖子。外部 url 是指我没有托管在我的服务器上的 url。该 url 在 iframe 中调用。我需要知道这在技术上是否可行。

我尝试使用 curl 执行此操作,但 curl 创建了自己与远程服务器的会话,而我想使用浏览器已经创建的会话。

请让我知道您对此的看法。

  <?php

php code to make http post.

        ?>


    <iframe src="outside url to be posted" height="100" width="100"/>

外部 url 是谷歌日历,所以当我调用它时,如果用户已经登录到谷歌,他的日历应该会显示,我需要使用 http post 向日历发帖以保存日历事件。

我希望这能让我更清楚自己想要达到的目标。

【问题讨论】:

  • 您想将您网站上的会话用于其他网站吗?
  • 什么意思,想使用浏览器已经创建的会话。?浏览器发布,这意味着用户,而不是 PHP(javascript 是可能的)。或者 PHP 帖子,这意味着您的服务器帖子,而不是用户。
  • @konerak,是的,用户发帖,我想让他在 iframe 中保持登录状态。所以我认为JS在这里会是一个很好的解决方案。

标签: php ajax curl http-post


【解决方案1】:

更新 - 当前答案

更新您的问题后,这里有一个不同的答案,我认为它更能解决您的问题。

我认为您要问的问题涉及在另一个站点上使用用户凭据进行操作。这在Cross-site Request Forgery附近跳舞很危险。

如果你只在用户要求你做的时候做 POST,它会好一点(我猜)但仍然不可取。

您为什么不使用Google Calendar API 来做您需要的事情?


上一个答案

您需要告诉 cURL 使用特定会话。由于 PHP 正在管理会话,因此您还需要告诉 php 在 cURL 使用会话时停止写入会话。

试试这个:

$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
session_write_close();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );
$response = curl_exec($ch);
curl_close($ch);

$_COOKIE['PHPSESSID'] 将是您的 PHP 会话的标识符,$url 将是您从 iframe 中提取的 URL。

这实际上是从this blog post 中逐字记录的。这是 Google 上最早的链接之一,所以我没有做太多额外的挖掘工作。

我对 cURL 和 PHP 会话做了一些处理,所以根据我的记忆,这看起来是正确的。

编辑:

顺便说一句,您应该参考this SO question 来了解使用 cURL 进行 POST 的方法。我假设您至少对如何执行此操作有所了解,但如果您需要复习一下的话。

另外(如果还不清楚的话),你可以运行尽可能多的

curl_setopt($handle, (CURL OPTION), (CURL VALUE));

根据需要配置 cURL 的行。

例如:

  • POST vals
  • 会话设置
  • 等等等等

祝你好运!

【讨论】:

  • 如果每个人都为社区的其他人解释他们的反对意见不是很好吗?那只会膨胀。 “每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能有危险的答案时,请投反对票![...] 投反对票不是我们希望你掉以轻心的事情。”请解释您投反对票的帖子是如何“极其草率”、“不费吹灰之力”或“明显或危险地错误”的,以便每个人都受益。
  • 这看起来很有趣,来自外部来源并且来源被正确引用。我以前从未在 php&curl 上看到或使用过显示的选项,所以我很感兴趣这是否可行以及为什么它被否决...很好找到恕我直言。
  • 这似乎是一个很好的解决方案,我已将其标记为答案,谢谢提醒伙伴。我会阅读博文了解更多详情。
  • @Sumit @Konerak 我已经更新了我的答案以添加一些信息,如果你仍然有兴趣追求这个。
  • @rockerest,在修改了你的方法几个小时后,我得出结论,它在我的情况下不起作用。由于用户会话在浏览器和谷歌之间,所以我无法在我的服务器上读取该会话。唯一可行的方法是 ajax/js 解决方案,我现在正在研究一个。顺便说一句,我也更新了我的帖子。
【解决方案2】:

这是 javascript,而不是 php。

<form id="post_form" method="post" target="post_frame">
<input type="hidden name="field1" value="value1>
.... other fields
</form>
<script type="text/javascript">
  document.getElementById("post_form").submit();
</script>
 <iframe name="post_frame" height="100" width="100"/>

【讨论】:

    【解决方案3】:

    就在file_get_contents man page:

    <?php
    // Create a stream
    $opts = array(
      'http'=>array(
        'method'=>"POST",
        'header'=>"Accept-language: en\r\n" .
                  "Cookie: foo=bar\r\n"
      )
    );
    //put post content into cookie part
    $context = stream_context_create($opts);
    
    // Open the file using the HTTP headers set above
    $file = file_get_contents('http://www.example.com/', false, $context);
    ?>
    <div><?=$file?></div>
    

    不是 iframe,而是相同的想法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 2020-08-16
      • 2013-12-19
      • 2010-09-15
      • 2022-01-19
      • 2014-01-16
      相关资源
      最近更新 更多