跨域请求被阻止:

10

我有一个使用API通过登录表单验证用户的移动应用程序。

这一直运作良好,但今天当我尝试登录时,在控制台日志中出现了以下消息:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myapp.local/myAppApi/V1/appLogin. 
This can be fixed by moving the resource to the same domain or enabling CORS.

显然我需要启用CORS来读取消息,在我的 Yii 应用程序中的 myApiController.php 文件中,我认为下面的代码应该可以实现这一点:

protected function _renderJSON($status = 200)
{
    $statusCodeMessage = $this->_getStatusCodeMessage($status);
    header("HTTP/1.1 {$status} {$statusCodeMessage}");

    // allow for Cross Origin Resource Sharing
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
    header("Access-Control-Allow-Headers: Authorization");
    header('Content-type: application/json');
    echo CJSON::encode($this->jsonArray);

    foreach (Yii::app()->log->routes as $route) {
        if ($route instanceof CWebLogRoute) {
            $route->enabled = false; // disable any weblogroutes
        }
    }
    Yii::app()->end();
}

有没有人能帮忙解决这个问题?该应用程序是使用cordova框架制作的,它连接到的API通过使用Yii构建的PHP应用程序工作。

任何建议都将不胜感激。

-- 更新 -- 我已经添加了以下内容到我的 htaccess 文件中,但没有起作用。

<ifModule mod_headers.c>
 Header set Access-Control-Allow-Origin: *
 Header set Access-Control-Allow-Headers: Authorization
 Header set Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
</ifModule>

-- 更新 -- 我发现了这个链接,看起来很有用 https://gist.github.com/sourcec0de/4237402


问题是在真实设备上发生的,还是只在本地测试时出现的? - Nicolas R
我正在使用本地设置(WAMPServer等),虚拟主机信息对您有用吗? - Zabs
你是否尝试在你的wamp服务器上设置CORS,像这样:https://dev59.com/vWIj5IYBdhLWcg3wRTL3但是对于你的实际实现,你不应该有这个问题,只有当你本地调试时才会出现这个问题,是吗? - Nicolas R
不幸的是,我只构建了PHP API,所以对于html5应用程序没有完全的理解,据我所知,我添加的标题应该启用CORS,因为在某个时候这已经起作用了(仍在努力理解这些内容)。 - Zabs
@NicolasR 如果我通过模拟器运行这个“应用程序”,使其像在 iPhone 上一样正常运行,我是否仍会遇到这个 CORS 问题? - Zabs
在模拟器上,你可能会遇到这个问题,因为它仍然是你的计算机试图与你的计算机通信。 - Nicolas R
1个回答

14

尝试在API控制器构造函数中添加以下代码,对我有效。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接