我被聘请写一个wordpress插件,其中包含对网站的eventespresso api的ajax请求。
我在本地工作正常(从我的本地服务器调用实时网站的api),但是当我在实际网站上激活插件时,它会抛出:
无法加载http://example.com/wp-json/ee/v4.8.36/events:The “Access-Control-Allow-Origin”标头的值为“http://opt.local” 这不等于提供的原产地。起源 因此,“http://www.example.com”不允许访问。
我的本地域名为“http://opt.local”,实际网站为http://example.com。
这个错误告诉我,它只想允许从我的本地设置访问,而不是从现场站点访问,这甚至不是跨域的!也许我让它在开发中缓存了错误的东西?
因此,除了我需要的具体路线之外,还有一些测试显示,除了特定路线外,其他所有设置都是正确的。
> curl -I "http://example.com/wp-json"
Access-Control-Allow-Origin: http://example.com
> curl -I "http://example.com/wp-json/ee/v4.8.36"
Access-Control-Allow-Origin: http://example.com
> curl -I "http://example.com/wp-json/ee/v4.8.36/events"
Access-Control-Allow-Origin: http://opt.local
我能够通过使用ee / v4.8.35(较低的api补丁版本)使其工作,但希望有更好的解决方案。
答案 0 :(得分:0)
我帮助开发了EE4 REST API。
雅听起来像网络服务器或代理或其他什么东西缓存了Access-Control-Allow-Origin标题。
EE4 REST API中没有控制该标头的代码,这些代码实际上由WP API(构建EE4 REST API)处理。
相关代码位于wp-includes/rest-api.php
函数的rest_send_cors_headers()
中。这会调用get_http_origin()
,其值可以使用过滤器http_origin
进行过滤。
所以你可能想尝试添加像
这样的东西function my_plugin_force_correct_http_origin($http_origin) {
return 'http://example.com';
}
add_filter('http_origin', 'my_plugin_force_correct_http_origin');
将确保PHP代码发送正确的Access-Control-Allow-Origin标头。
如果这还没有解决问题,我会验证rest_send_cors_headers()
是否已被调用(您可以暂时在该函数中放置一行echo 'called rest_send_cors_headers!';die;
来检查)。
如果它被调用,而我建议的过滤器没有帮助,您可以尝试使用' wordpress-rest-api'标记您的问题。另外,我很想知道http://example.com/wp-json/ee/v4.8.36/events?limit=50
是否有同样的问题。