3

我需要通过 Ajax 向远程域发出 POST 请求,我知道存在同源策略的限制,但我读过可以在我的服务器上的 PHP 中建立一个桥梁来转发请求。

事实是我不知道如何写这个桥,我在谷歌上找不到信息。
我想我需要使用 CURL。

有人能解释一下怎么写吗?

4

3 回答 3

4

如果您需要代理或“”,您可以尝试如下: 您可以实现对该 PHP 脚本的简单 AJAX 调用,并将该 POST 重定向到您想要的另一台服务器。

这个怎么运作:

  1. 创建 Proxy.php 并粘贴内容。
  2. 使页面最初发送请求以将 AJAX 请求发送到 proxy.php 而不是目标服务器。
  3. 请求将被重定向到目标服务器。
  4. 如果需要结果,您可以选择设置选项CURLOPT_RETURNTRANSFER 。

请记住首先放置一些服务器身份验证方法,因为我在示例中没有写任何内容,否则该页面将成为一个不错的垃圾邮件机器

编辑:我的意思是使用您的服务器向目标服务器提交故障请求。无论如何,为您的用户添加一些简单的身份验证并不是那么糟糕:)

some/where/in/your/server/proxy.php

<?php
/* You might want some authentication here */
/* check authentication */
/* Authentication ended. */
$url = 'http://target.com/api'; //Edit your target here
foreach($_GET as $getname => $getvar) {
    $fields[$getname] = urlencode($getvar); //for proxying get request to POST.
}

foreach($_POST as $postname => $postvar) {
    $fields[$postname ] = urlencode($postvar); //for proxying POST requests.
}
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

我假设您已经知道发送 POST ajax 请求的方式。如果您不是,请尝试阅读 http://www.openjs.com/scripts/jx/jx.php

于 2013-09-14T10:10:50.520 回答
0

根据您的 PHP 配置和请求的复杂性,您很可能只使用file_get_contents函数即可。例如:

<?php
if (!isset($_GET["id"])) {
    die("No ID passed");
}
$theID = (int)$_GET["id"];

echo file_get_contents("http://example.com/getSomeData?id={$theID}");

如果你把它放在你域上的一个 PHP 文件中,你可以使用 AJAX 来请求这个文件,而不受相同域策略的限制,它会返回你在函数调用中指定的任何远程页面的内容。

请注意,此file_get_contents函数的使用需要启用allow_url_fopen指令。否则,您将不得不使用像 Curl 这样的库来执行来自 PHP 的请求。

于 2013-09-14T09:48:49.057 回答
0

如果您控制要发布到的服务器,则可以以允许发布的方式设置策略。看到这个答案

如果您不控制服务器,则必须设置一个代理,您可以用 PHP 编写该代理。它真正做的只是在你的 JavaScript 和目标服务器之间传递信息。

  1. 在您的站点上创建一个端点,例如/proxy
  2. 像往常一样提出请求,但不是指向原始 URL,而是指向/proxy/<original_url>.
  3. 在处理/proxy端点的文件中,您只需提取 HTTP 方法、URL 标头、参数、正文等,并向目标服务器发出完全相同的请求。您可以使用cURLGuzzle 之类的包来执行此操作。还有一些包为您提供此代理功能,但我不熟悉它们的质量。
于 2013-09-14T09:51:12.247 回答