CORS与Laravel 4

时间:2013-07-09 02:37:28

标签: php laravel laravel-4 cors

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

当我尝试通过Backbone从我的网络应用程序(即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密钥。这只是工作正常。但是,当我尝试向/users Chrome发出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设置为'*'我可以从互联网上找到的所有内容。但迄今为止没有任何工作。我不知道该怎么做。

3 个答案:

答案 0 :(得分:6)

标题名称中有错误。

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

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.              

答案 1 :(得分: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;
    }
});

答案 2 :(得分:0)

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

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

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

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