我正在编写 ActionScript3 flash 游戏,它需要访问赞助商(游戏购买者)指定的 REST 服务——比如高分等。我知道如何使用 URLLoader、URLRequest、设置 URLRequestHeader。
不幸的是,赞助商在共享主机上,不能将 crossdomain.xml 放在服务器根目录中,所以我无法从我的 localhost flash 游戏(同源策略)连接到它。我了解到有一种方法可以通过不同服务器上的 php 文件代理调用来连接到 REST API。
所以我在我的私人服务器上有一个 proxy.php 文件,并称它为:
www.myserver.pl/scripts/proxy.php?url=http%3A%2F%2sponsorserver.hosting.com/api/init.json
(url=URLEncoded address)
它连接(返回 HTTP 200),但是我还不知道如何将自定义标头传递给 init.json 脚本;我尝试了通过 GET 和 POST 发送它们的所有组合,以及通过 GET 和 POST 调用脚本(使用 RESTClient FF 扩展)。
这是proxy.php:
$getvars = 'myparam1=3;&myparam2=data;'; // for test purposes
$url = $_GET['url'] . '?' . $getvars;
$session = curl_init($url);
curl_setopt($session, CURLOPT_HEADER, true);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec_follow($session);
echo $response;
curl_close($session);
不幸的是,我的服务器有 base_dir != '' 所以我不能设置 CURLOPT_FOLLOWLOCATION 并使用 curl_exec,因此 curl_exec_follow (取自这个 SO 答案:https ://stackoverflow.com/a/10835824/2492808 )。这可能是为什么 init.json 没有获取 GET 变量的原因吗?它说它没有看到 myparam1 和 myparam2。不幸的是,我无法更改服务器上的 php.ini,并且需要一种使其正常工作的方法,以便我可以从我的 IDE 集成和测试赞助商的 rest API。谢谢!
编辑:这很愚蠢,我想发送给赞助商脚本的不是 GET 变量,而是 http 标头。所以我删除了 $getvars 并添加了:
curl_setopt ($session, CURLOPT_HTTPHEADER, Array('myparam1=3','myparam2=data'));
在 curl_exec_follow 和内部之前,在每个新的 curl_exec 调用之前,理论上应该设置标题并使其通过。不幸的是,脚本仍然看不到标题:(
此外,根据php 手册,我尝试通过将 .htaccess 放入 www.myserver.pl/scripts/ 来删除 base_opendir 限制:
<IfModule mod_php5.c>
php_value open_basedir ""
</IfModule>
但这并没有改变任何东西,可能我没有
“AllowOverride Options”或“AllowOverride All”权限这样做
所以 CURLOPT_FOLLOWLOCATION 仍然是非法的。