我正在编写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
设置为'*'
我可以从互联网上找到的所有内容。但迄今为止没有任何工作。我不知道该怎么做。
答案 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文件可能会有帮助,但有更稳定的解决方案:
这取决于您的基础架构和需求,但如果性能很重要,请跳过卷曲。