CORS与Laravel 4

Umu*_*rin 17 php cors laravel laravel-4

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

当我尝试通过Backbone从我的web-app(即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);
    }
});
Run Code Online (Sandbox Code Playgroud)

我的后过滤器:

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;
});
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试/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.
Run Code Online (Sandbox Code Playgroud)

我什么都试过,如设置Access-Control-Allow-Origin'*'了所有我能能够从互联网上找到.但迄今为止没有任何工作.我不知道该怎么做.

Dip*_*u R 6

标题名称中有错误.

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

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.              
Run Code Online (Sandbox Code Playgroud)


小智 0

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

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

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

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