restler 3跨域无效

时间:2013-03-09 15:38:43

标签: rest cross-domain restler

我的restler 3 api在本地测试服务器上工作正常,并且如果来自同一台服务器的呼叫在生产服务器上工作正常,但是如果我远程拨打电话那么它会失败。

使用相同的休息客户端和luracast在线示例,它可以正常使用远程调用,所以必须在我的配置中(我的api或我的生产服务器)。

我发现需要发送标头,因此尝试将这些标头添加到index.php文件中:

header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: *');

但这没有帮助。在firefox中使用RESTClient插件,我可以看到这些标头被发送,浏览器将在本地和远程显示数据,无论我是否使用这些标头命令。

以下是一个示例电话: https://api.masterpiecesolutions.org/v1/artists/?key=A4oxMOYEUSF9lwyeFuleug==

我的index.php用于该调用,第二个参数映射到根级别

$r->addAPIClass('Artists', '');

不知道这是否相关。

此外,生产服务器是Amazon EC2,因此可能与安全策略有关吗?

或者,也许是其他一些标题问题?在谷歌浏览器中,使用Advanced Rest Client扩展程序,它提供403 ForbiddenContent-Type的状态为text/plain(无论是使用本地服务器还是远程服务器),因此它根本不起作用,不像firefox插件。

我也看到在Restler.php中使用$_SERVER['HTTP_ORIGIN'],这似乎并不是所有地方都支持吗?

2 个答案:

答案 0 :(得分:1)

*不是Access-Control-Allow-Headers响应标头的有效值。您需要列出每个非简单请求标头。例如:

header('Access-Control-Allow-Headers: Content-Type');

还要考虑为*标头添加单个原始值或Access-Control-Allow-Origin。我刚访问了您的示例网址,该标头中有多个值。虽然这应该符合CORS规范,但它还没有被广泛采用。

最后我注意到服务器正在设置Access-Control-Allow-Credentials: true。如果将其设置为true,那么您还需要执行其他两项操作:

  1. Access-Control-Allow-Origin标头的值必须是Origin的值(例如http://localhost,不能是*)。
  2. 您需要在JavaScript客户端代码中设置xhr.withCredentials = true;
  3. 如果您只是在测试,那么您应该尝试在不设置Access-Control-Allow-Credentials标头的情况下完成工作。它将使调试更容易。

答案 1 :(得分:1)

至少对我来说问题是使用SSL而且restclient类不适应。

所以我添加了(来自phpclasses.org的RestClient.class.php)     curl_setopt($ this-> curl,CURLOPT_SSL_VERIFYPEER,false); //用于SSL 现在它有效。

还需要设置         public static $ crossOriginResourceSharing = true; 在Rests. 3的Defaults.php中。