Laravel angularJS CORS使用barryvdh / laravel-cors

时间:2014-04-17 13:55:27

标签: angularjs nginx laravel cors

已经六个小时了,我仍然无法解决以下问题。

我正试图让AngularJS从不同的域名中获取我的API。在搜索互联网之后,我发现这个package它说它可以"在你的Laravel应用程序中添加CORS(跨源资源共享)标头支持"

我遵循了所有指示。设置这个和那个让它工作,但仍然没有运气。我的服务器总是向我发送以下错误:

  

XMLHttpRequest无法加载http://lab.laracon/v1/lists?id=123&password=whatever&username=OSVC8HKKcvCFrsqXsMcbOVwVQvOL0wr3。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://lab.angularapi'因此不允许访问。

这是我的角色代码:

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-cors配置文件:

'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服务器配置:

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';

    }

任何人都可以帮助我吗?我的代码和配置有什么问题?感谢

2 个答案:

答案 0 :(得分:4)

最后,我为我的情况找到了合适的解决方案:

  1. 我完全摆脱了barryvdh / laravel-cors
  2. 感谢Dan Horrigan的推文
  3. Simple CORS with laravel

    但是,我稍微改变了一下代码(我不知道为什么$ response-> headers-> set();不能正常工作。相反,我将它添加到我的控制器中:

    public function __construct()
        {
            $this->afterFilter(function(){
    
                header('Access-Control-Allow-Origin: *');
    
            });
        }
    

    它就像老板一样:)

答案 1 :(得分:2)

我最近更新了我的laravel-cors package,因此您可能需要再次查看。 但是直接设置Access-Control-Allow-Origin:*标头(使用响应对象)也可以工作,它只是不检查允许的主机,标头和方法等。

更多Laravel设置标题的方法是定义Route filter并修改响应。

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中设置标题,一个就足够了。