【问题标题】:Enable CORS on JSON API Wordpress在 JSON API Wordpress 上启用 CORS
【发布时间】: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

我会得到一些帮助谢谢!!!

【问题讨论】:

    标签: jquery json wordpress cors


    【解决方案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

    希望能帮助更多有同样问题的人!

    【讨论】:

    • 对于像我这样困惑的任何人,请将其添加为 &lt;?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 核心文件。任何人在看这个问题,不要使用这个答案,这很危险。
          猜你喜欢
          • 2018-05-07
          • 2014-12-04
          • 2013-06-12
          • 2022-01-16
          • 2015-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多