在 JSON API Wordpress 上启用 CORS
Posted
技术标签:
【中文标题】在 JSON API Wordpress 上启用 CORS【英文标题】:Enable CORS on JSON API Wordpress 【发布时间】:2014-10-31 08:41:59 【问题描述】:我有一个带有名为 JSON API 的插件的 wordpress 网站。此插件为 wordpress 中的内容提供 JSON 格式。我可以通过添加 header("Access-Control-Allow-Origin: *"); 在 wordpress 上启用 CORS;在 php 标头上。但是当我尝试 JSON API 插件提供的 url 时,CORS 不再起作用。
这是我正在做测试的 wordpress 网站...我使用 test cors 网站检查它是否正常工作并且它是... http://kiwa-app.loading.net/
但是当我尝试使用 JSON api 提供给我的 url 时,它不再工作了。我仍然有错误 No 'Access-Control-Allow-Origin' http://kiwa-app.loading.net/?json=info
我会得到一些帮助谢谢!!!
【问题讨论】:
【参考方案1】:我使用了一些不同的 WordPress API——但对于那些使用“官方”WP-API 的人来说,我在使用这个 CORS 时遇到了很多麻烦——我发现 在 .htaccess 之间方法 以及我偶然发现的其他一些方法...将其添加到您的主题 functions.php 效果最好。
function add_cors_http_header()
header("Access-Control-Allow-Origin: *");
add_action('init','add_cors_http_header');
确保不要使用这些(.htaccess、header.php、api.php、functions.php)的任何组合,因为它会生你的气。
【讨论】:
这适用于 v1,但我又遇到了这个问题 - 我对 v2 还没有任何运气。 适用于 Wordpress API V2。我能找到的最佳解决方案。 这是唯一适合我的解决方案。某些服务器不允许您在 htacces 中设置 CORS 这对我有用!测试并确保其正常工作的一个好方法是检查标头 — Advanced Rest Client 是一个很好的工具。 这在 Wordpress V5 中对我不起作用,我检查了标题但我的标题不在其中。【参考方案2】:好吧,我终于想出了一个简单的方法......
你只需要添加:
<? header("Access-Control-Allow-Origin: *"); ?>
在文件api.php上,这个文件位于wp-content/plugins/json-api/singletons/api.php
希望能帮助更多有同样问题的人!
【讨论】:
对于像我这样困惑的任何人,请将其添加为<?php
之前的第一行,不要有空行。
不应该编辑核心文件,使用过滤器更好。
每次 wordpress 更新、否决时都会删除此行更改。
正如@IvanCastellanos 所说,这是一个非常肮脏的修复,当 WordPress 更新时会丢失
wp-content/plugins/json-api/singletons/api.php
在我的中找不到。在/wp-includes/rest-api
中找到了与 rest api 相关的内容,但如果需要更改,请查看 idk。【参考方案3】:
在响应发送到浏览器之前,我们可以运行two action hooks并插入一个新的header()
:
do_action("json_api", $controller, $method);
do_action("json_api-$controller-$method");
第一个在每个方法上运行,第二个是针对特定方法。这是第一个的实现,带有注释的方法可以找到第二个:
add_action( 'json_api', function( $controller, $method )
# DEBUG
// wp_die( "To target only this method use <pre><code>add_action('$controller-$method', function() /*YOUR-STUFF*/ );</code></pre>" );
header( "Access-Control-Allow-Origin: *" );
, 10, 2 );
【讨论】:
json-rest-api 插件的动作有:json_insert_post, json_insert_user, json_query_navigation_headers, wp_json_server_before_serve【参考方案4】:使用 Wordpress 5.2.3 - 在外部使用 GET 和 POST 时,以下终于为我打开了芝麻。在找到适合我的情况的解决方案之前,我尝试了上述所有答案(无济于事)。
add_action( 'rest_api_init', function ()
add_action( 'rest_pre_serve_request', function ()
header( 'Access-Control-Allow-Headers: Authorization, Content-Type, X-WP-Wpml-Language', true );
header("Access-Control-Allow-Origin: *");
);
, 15 );
希望 WordPress 将来会有一个用于 CORS 控制的官方狗门襟。
【讨论】:
你在哪里添加了这个文件。 @ChinomsoJohnson functions.php 在您的主题文件夹中【参考方案5】:现在 REST API 已与核心合并,我们可以使用 rest_api_init
操作。
add_action( 'rest_api_init', function()
header( "Access-Control-Allow-Origin: *" );
);
【讨论】:
我应该将它添加到哪个文件中? @HaseebBurki 上面的代码扩展了一个动作。您可以将此代码添加到主题的 functions.php 文件中,也可以添加到新的自定义插件中。【参考方案6】:WordPress 5(实际上是 4.4+)可以通过 WP Headers 处理它:
试试这个:
add_filter( 'wp_headers', 'send_cors_headers', 11, 1 );
function send_cors_headers( $headers )
$headers['Access-Control-Allow-Origin'] = $_SERVER[ 'HTTP_ORIGIN' ];
return $headers;
请注意,这将允许从任何来源进行访问。为了安全起见,您应该尝试设置一组允许的域,这些域可以向您的 WordPress 站点发出请求,如果发出请求的域不在允许列表中,则短路允许 CORS:
add_filter( 'wp_headers', 'send_cors_headers', 11, 1 );
function send_cors_headers( $headers )
$allowed_domains = array( 'https://my.okdomain.com' , 'http://anothergoodone.com');
if ( ! in_array( $_SERVER[ 'HTTP_ORIGIN' ] , $allowed_domains ) ) return $headers;
$headers['Access-Control-Allow-Origin'] = $_SERVER[ 'HTTP_ORIGIN' ];
return $headers;
【讨论】:
有没有人知道把这段代码放在哪里?【参考方案7】:在 wordpress 中转到插件 > JSON API > 编辑
从右侧文件选择中选择
json-api/singletons/api.php
您需要添加以下行
header("Access-Control-Allow-Origin: *");
完成后,您的代码应该与此类似。 在其他任何地方添加此行可能无法按预期工作。
<?php
header("Access-Control-Allow-Origin: *");
class JSON_API
function __construct()
$this->query = new JSON_API_Query();
$this->introspector = new JSON_API_Introspector();
$this->response = new JSON_API_Response();
add_action('template_redirect', array(&$this, 'template_redirect'));
add_action('admin_menu', array(&$this, 'admin_menu'));
add_action('update_option_json_api_base', array(&$this, 'flush_rewrite_rules'));
add_action('pre_update_option_json_api_controllers', array(&$this, 'update_controllers'));
function template_redirect()
【讨论】:
如果没有安装json api怎么办?【参考方案8】:如果有人在尝试所有上述代码(在您的主题中更改 funtions.php
)/.htaccess
方式后仍然遇到任何问题,那么这个问题可能与您的托管服务提供商有关。
我已经尝试了所有可能的方法,并在这个问题上浪费了两天时间,才知道问题是由于infinityfree . com
(免费托管服务提供商)造成的。
参考: https://wordpress.org/support/topic/wordpress-api-blocks-post-by-cors-policy/ https://wordpress.org/support/topic/wordpress-api-blocks-post-by-cors-policy-2/
【讨论】:
【参考方案9】:对于遇到多个来源
这个问题的任何人在托管您的 wordpress 网站的服务器中,导航到 ../wp-content/plugins/json-rest-api 并从此处打开 plugin.php 文件。
在这个函数中
function json_send_cors_headers( $value ) ..
更改标题
header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) );
到
header( 'Access-Control-Allow-Origin: *' );
希望这对遇到与我相同问题的人有所帮助。
【讨论】:
【参考方案10】:该解决方案适用于 WordPress 5.1.1 和 Gutenberg
add_filter('rest_url', function($url)
$url = str_replace(home_url(), site_url(), $url);
return $url;
);
【讨论】:
【参考方案11】:在 WordPress 项目中转到以下文件并执行以下操作:
在wp-includes/rest-api.php
更改:
header( 'Access-Control-Allow-Origin: ' . $origin );
到:
header( 'Access-Control-Allow-Origin: *' );
在wp-includes/http.php
更改:
header( 'Access-Control-Allow-Origin: ' . $origin );
到:
header( 'Access-Control-Allow-Origin: *' );
【讨论】:
您不想更改wp-includes
文件夹,因为如果您更新它可能会被删除。
永远不要更改 wp 核心文件。任何人在看这个问题,不要使用这个答案,这很危险。以上是关于在 JSON API Wordpress 上启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章
启用 CORS 从 Cordova 应用程序调用 JSON REST
如何让 Wordpress JSON-API 在 Nginx 服务器上工作?
WordPress acf-to-rest-api && Rest API