17

我正在编写一个 API,并使用 Laravel 4 来实现。我的 api 位于不同的域。让我们假设它是:http://api-example.com/

当我尝试通过 Backbone 从我的 web 应用程序(即mydomain.com)使用基本身份验证向我的 api 发出 ajax 请求时,它有时工作得很好,但有时却不行。我试图找出原因。下面是我的App::before过滤器和App::after过滤器。

App::before(function($request)
{
    if($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        $statusCode = 204;

        $headers = [
            'Access-Control-Allow-Origin'      => 'http://mydomain.com',
            'Allow'                            => 'GET, POST, OPTIONS',
            'Access-Control-Allow-Headers'     => 'Origin, Content-Type, Accept, Authorization, X-Requested-With',
            'Access-Control-Allow-Credentials' => 'true'
        ];

        return Response::make(null, $statusCode, $headers);
    }
});

还有我的后过滤器:

App::after(function($request, $response)
{
    $response->headers->set('Access-Control-Allow-Origin', 'http://mydomain.com');
    $response->headers->set('Allow', 'GET, POST, OPTIONS');
    $response->headers->set('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Requested-With');
    $response->headers->set('Access-Control-Allow-Credentials', 'true');
    return $response;
});

问题是当我尝试/login使用凭据发出发布请求时,API 检查数据库并获取用户的 API 密钥。这工作正常。但是当我尝试向/userschrome 发出 POST 请求时,只会给我以下错误:

XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.

我尝试了一切,例如设置Access-Control-Allow-Origin'*'我可以从互联网上找到的所有内容。但到目前为止没有任何效果。我不知道我应该怎么做。

4

3 回答 3

6

标题名称有误。

header('Allow', 'GET, POST, OPTIONS'); // This is wrong.

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.              
于 2013-09-02T13:15:34.650 回答
3

制作一个花哨的响应对象并返回它是没有意义的,然后让页面进程运行,因为它会消除您的 CORS 标头并继续使用通常的内容。

App::before(function($request)
{
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {

        header('Access-Control-Allow-Origin', 'http://mydomain.com');
        header('Allow', 'GET, POST, OPTIONS');
        header('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Request-With');
        header('Access-Control-Allow-Credentials', 'true');

        exit;
    }
});
于 2013-08-16T19:49:06.407 回答
0

一些浏览器可能会否认这一点,因为 XSS 脚本以这种方式做着令人讨厌的事情。

如果您从http://api-example.com/加载 js 文件可能会有所帮助,但有更稳定的解决方案:

  • 您可以使用 curl (或类似的东西)或
  • 您可以为您的 AJAX 请求使用代理(Apache、Nginx 等)来加载来自其他主机的响应
  • 或者,如果您正在使用负载均衡器或前端缓存的东西,您可以创建一个规则......

这取决于您的基础架构和需求,但如果性能很重要,请跳过 curl。

于 2013-07-26T10:25:33.950 回答