【问题标题】:Laravel angularJS CORS using barryvdh/laravel-corsLaravel angularJS CORS 使用 barryvdh/laravel-cors
【发布时间】:2014-06-01 20:12:36
【问题描述】:

已经六个小时了,我仍然没有得到以下问题的解决方案。

我正在尝试让 AngularJS 从不同的域访问我的 API。在互联网上搜索后,我发现了这个package,它说它可以“在你的 Laravel 应用程序中添加 CORS(跨域资源共享)标头支持”

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

XMLHttpRequest 无法加载 http://lab.laracon/v1/lists?id=123&password=whatever&username=OSVC8HKKcvCFrsqXsMcbOVwVQvOL0wr3。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 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-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';

    }

谁能帮帮我?我的代码和配置有什么问题?谢谢

【问题讨论】:

  • 使用邮递员测试独立于角度的端点
  • 当您发出请求时服务器会响应什么(什么标头)?发出 CORS 请求时,响应需要包含 Access-Control-Allow- 标头。通常当 CORS 不起作用时,这是因为响应缺少某些内容。
  • @shaunhusain 当我用邮递员测试它时,一切都运行良好。服务器向我发送了 JSON 数据。状态 200 正常。
  • @J.Wells 这正是问题所在。我知道服务器标头不包含 Access-Controll_allow。这就是为什么我用 laravel-cors 库插入我的应用程序的原因。但它似乎根本不起作用。我认为我的代码有问题,但我找不到。
  • 当浏览器中的请求来自域 X 但转到域 Y 时,就会出现 CORS 问题。在服务器 Y 上响应的服务器必须将响应标头设置为允许来自域 X 的请求,否则浏览器将停止实际请求(您会看到一个 OPTIONS 请求)

标签: angularjs nginx laravel cors


【解决方案1】:

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

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

Simple CORS with laravel

但是,我稍微更改了代码(我真的不知道为什么 $response->headers->set(); 不起作用。相反,我将其添加到我的控制器中:

public function __construct()
    {
        $this->afterFilter(function(){

            header('Access-Control-Allow-Origin: *');

        });
    }

它像老板一样工作:)

【讨论】:

  • 这里建议你应该使用 $response->headers->set();调用而不是 header()。我不认为将 header() 与 Symfony/Laravel 的响应对象结合使用真的很合适。请参阅这篇文章:acairns.co.uk/2013/01/routing-and-cors-with-laravel-4(但不确定是否需要返回响应,因为它会在Filters 之后停止..)
【解决方案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 中都设置了标头,一个就足够了。

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 2015-02-19
    • 2014-12-21
    • 2015-04-12
    • 2017-04-20
    • 2016-02-14
    • 2018-05-07
    • 2020-07-15
    • 2015-05-16
    相关资源
    最近更新 更多