已经有六个小时了,我仍然没有得到解决以下问题的方法。
我试图让AngularJS从不同的领域打我的API。 在search互联网后,我发现这个软件包说它可以“在您的Laravel应用程序中添加CORS(跨源资源共享)头文件支持”
我遵循了所有的指示。 设置这个,并得到它的工作,但仍然没有运气。 我的服务器总是发送给我以下错误:
XMLHttpRequest无法加载http://lab.laracon/v1/lists?id = 123&password = whatever&username = OSVC8HKKcvCFrsqXsMcbOVwVQvOL0wr3 。 请求的资源上没有“Access-Control-Allow-Origin”标题。 原因' http://lab.angularapi '因此不被允许访问。
这里是我的Angular代码:
var Demo = angular.module( "Demo", [ "ngResource" ] ); Demo.controller( "ListController" function( $scope, ,$http, $resource ) { $http.defaults.useXDomain = true; $scope.useResource = function() { var Lists = $resource('http://lab.laracon/v1/lists', { username: 'OSVC8HKKcvCFrsqXsMcbOVwVQvOL0wr3', password: 'whatever' }); Lists.get({ id: 1 }, function(data) { alert(data.ok); }); }; } );
这是我的barryvdh laravel–corsconfiguration文件:
'defaults' => array( 'allow_credentials' => false, 'allow_origin' => array(), 'allow_headers' => array(), 'allow_methods' => array(), 'expose_headers' => array(), 'max_age' => 0, ), 'paths' => array( '^/v1/' => array( 'allow_origin' => array('*'), // 'allow_headers' => array('Content-Type'), 'allow_headers' => array('*'), 'allow_methods' => array('POST', 'PUT', 'GET', 'DELETE', 'OPTIONS'), 'max_age' => 3600, ), ),
最后这里是我的nginx服务器configuration:
location / { # URLs to attempt, including pretty ones. try_files $uri $uri/ /index.php?$query_string; add_header 'Access-Control-Allow-Origin' 'http://lab.angularapi'; add_header 'Access-Control-Allow-Credentials' 'false'; add_header 'Access-Control-Allow-Headers' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; }
谁能帮我? 我的代码和configuration有什么问题? 谢谢
最后,我找到了适合自己情况的解决方案:
简单的CORS与laravel
然而,我改变了一点点的代码(我不知道为什么$ response-> headers-> set();不工作,而是将其添加到我的控制器中:
public function __construct() { $this->afterFilter(function(){ header('Access-Control-Allow-Origin: *'); }); }
它像一个老板:)
我最近更新了我的laravel-cors软件包,所以您可能需要再次检查。 但是直接设置Access-Control-Allow-Origin:*头文件(使用响应对象)也是可行的,它只是不检查允许的主机,头文件和方法等。
设置标题的更多的Laravel方法是定义一个Route过滤器并修改响应。
Route::filter('access-control', function($route, $request, $response) { $response->headers->set('Access-Control-Allow-Origin', '*'); });
然后你可以在你的Controller中设置afterFilter,或者在你的routes.php文件中将它附加到一组路由中。
public function __construct() { $this->afterFilter('access-control'); }
或者在匹配模式时应用它:
Route::when('api/*', 'access-control');
我会直接避免使用header()函数。 另外,你在Nginx和Laravel中设置头文件就足够了。