通过WPEngine从wp-json API提供文本/html,标题设置不正确

时间:2019-01-14 作者:wlh

我已经阅读了WP Codex中的多个条目、许多文章和堆栈交换问题。我为我正在开发的一个私有插件提供了一个功能齐全的API,但当它在WPEngine上投入生产时text/html 存在CORS和CORB问题。我试着只为那条路线设置标题,但似乎没有任何效果。它在本地和开发服务器上运行良好。

Why serve HTML you ask?

我的插件连接了我在React中创建的WP表单。JS,通过管理门户,通过我们的CRM,通过IIS的另一个API。Net服务器。一旦有人提交表单,API就会接管事务并匹配HTML 我用一些其他内部数据发送电子邮件。为了安全、维护和更重要的跨平台目的,我们希望保持该系统的集中化(我们还提供其他技术栈)。

So What is Happening?

我可以从浏览器和html渲染中点击我的端点。我甚至可以从RESTlet/Postman那里获得html。然而,当我试图GET 从我们的内部API请求URL,服务器不允许该请求。

Here is the setup:

发送响应

//callback for register_rest_route
function proxy_email($request) {
    //some validation, db queries and other stuff

    header( \'Content-Type: text/html; charset=UTF-8\' );
    echo $html_email;
    exit();
}
搬运Cors

//handling cors
remove_filter( \'rest_pre_serve_request\', \'rest_send_cors_headers\' );
add_filter( \'rest_pre_serve_request\', function( $served, $result, $request, $server ) {
    $origin = get_http_origin();
    $route = $request->get_route();
    $allowed_origins = array(
        //the local, dev, and production origins plus the following:
        site_url()
    );

    // the route I set up for the email includes the string \'thankyou\'

    if ( $origin && in_array( $origin, $allowed_origins ) && preg_match( "/(thankyou)/", $route ) != 1) {
        header( \'Access-Control-Allow-Origin: \' . esc_url_raw( $origin ) );
        header( \'Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE\' );
        header( \'Access-Control-Allow-Credentials: true\' );
        header( \'Access-Control-Allow-Headers: Content-Type, X-WP-Nonce\');

    } else if ( $origin && in_array( $origin, $allowed_origins ) && preg_match( "/(thankyou)/", $route ) == 1 ) {
        header( \'Access-Control-Allow-Origin: \' . esc_url_raw( $origin ) );
        header( \'Access-Control-Allow-Methods: OPTIONS, GET\');
        header( \'Access-Control-Allow-Credentials: true\' );
        header( \'Access-Control-Allow-Headers: Content-Type\');
        header( \'Content-Type: text/html; charset=UTF-8\');
        header( \'Accept: */*\');
    }
    return $served;

}, 10, 4);
我的方法是否存在问题,这是WP问题,还是WPEngine问题,还是其他问题?

1 个回复
最合适的回答,由SO网友:wlh 整理而成

如果将来有人遇到这个问题:

我发现该错误与未正确配置外部api以处理对安全端点的请求有关。

因为我在WPEngine上的站点是安全的(https), IIS需要配置为处理TLS1.2,而TLS1.2不是(从这里开始查看碎屑痕迹:https://stackoverflow.com/questions/22627977/the-underlying-connection-was-closed-an-unexpected-error-occurred-on-a-send).

我问题中的配置按设计工作,尽管它可能设计得更好(请告诉我!)。调用此终结点的服务器配置不正确。