跨域POST请求获取Err_empty_response - 仅在Windows 7上的Chrome和FF中

时间:2016-06-27 23:04:28

标签: php ajax google-chrome cors wordpress-rest-api

我正在构建的单页面应用程序将AJAX发布请求发送到运行PHP的服务器。它几乎适用于我测试过的所有计算机。

例外是一些运行Windows 7的计算机。当应用程序从这些PC向服务器发出POST请求时,请求在预检阶段失败。预检请求在Chrome中收到err_empty_response的响应。预检请求甚至从未进入服务器(我已经检查了访问日志)。

GET请求工作正常,我假设因为没有预检步骤。

我很确定我已正确设置CORS设置,因为正如我所说,该应用程序适用于大多数计算机。事实上,它在IE11中在我遇到麻烦的相同计算机上运行良好。它只有Chrome(51)和Firefox出现问题,而且只能在这些Windows 7计算机上使用。

另一个奇怪的事情是,如果我完全重启计算机,POST请求将会工作一段时间。大约1或2分钟后,他们又开始失败了。

以下是其中一个使用Angular失败的POST请求的示例:

$http({
    method: 'POST',
    url: routeUrl,
    withCredentials: true,
    data: {
        username : email,
        email: email,
        password: password,
        rememberMe: rememberMe
    }
}).then(function successCallback(response) {
    // Do some stuff
}, function errorCallback(response) {
    // Do some stuff
});

这是使用WordPress REST api的已编辑的php。但是,它永远不会受到问题的计算机的影响。

<?php
function my_login( WP_REST_Request $request ) {
    // Database calls
}

add_action( 'rest_api_init', function () {
    register_rest_route( 'creator/v1', '/login', array(
        'methods' => 'POST',
        'callback'=> 'my_login'
    ) );
} );

function set_cors_allow_headers($value){

    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])){
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
        }

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])){
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
        }
    }

    return $value;
}
add_filter( 'rest_pre_serve_request', 'set_cors_allow_headers' );

提前致谢!如果我可以发布任何其他信息,请告诉我。

0 个答案:

没有答案