【问题标题】:Laravel giving CORS error just for one route/controllerLaravel 仅针对一个路由/控制器给出 CORS 错误
【发布时间】:2017-03-20 19:19:22
【问题描述】:

注意:在此问题的底部进行编辑

我遇到了一个非常奇怪的问题,我开始在这个问题上拔头发。我正在使用 Angular 和 Laravel 5.4。

我正在使用Barryvdh\Cors,它运行良好。但是由于某种原因,我只收到了一个控制器的以下错误,没有别的!

跨域请求被阻止:同源策略不允许读取 远程资源在 http://www.example.com/packing?data_type=prealert&shipment_ref=1。 (原因:CORS 标头中缺少令牌“访问控制允许标头” 来自 CORS 预检通道的“Access-Control-Allow-Headers”)。

这只发生在packing

这是我的路线(为了便于阅读,我省略了许多其他行):

    Auth::routes();

    Route::get('/', 'HomeController@index');

    Route::group([ 'middleware' => 'cors'], function()
    {

        // works
        Route::resource('prealert', 'PrealertController');

        // doesnt work
        Route::resource('packing', 'PackingController');

        // works
        Route::resource('shipping', 'ShippingController');

    });

我正在比较下面的两个控制器,您可以看到它们完全相同(我认为??)。

如果我改变了

Route::resource('packing', 'PackingController');

Route::resource('packing', 'PrealertController');

效果很好。

我假设它在 AngularJS 方面没有任何意义,因为我已经能够将其范围缩小到简单的那一行,即即使代码相同,当我简单地使用另一个控制器时它也可以工作。

这是我的PackingController (Http/Controllers/PackingController.php)

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\PublishPackingRequest;
use Mockery\CountValidator\Exception;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use DB;
use Auth;


class PackingController extends Controller {

    public function index( ) {

        die('test');

    }

}

还有我的PrealertController (Http/Controllers/PrealertController.php)

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\PublishPrealertRequest;
use Mockery\CountValidator\Exception;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Auth;
use DB;

class PrealertController extends Controller {


    public function index() {
        die('test');
    }

}

编辑:

所以它变得更奇怪了,我将我的 PackingController.php 复制到一个名为 AnotherController.php 的文件中,并将我的路由行更改为以下...

Route::resource('packing', 'AnotherController');

我也把类名改成了AnotherController

即使这样也行得通!也许我应该尝试删除文件

【问题讨论】:

  • 我的猜测是控制器中发生了一些错误,从而导致错误响应并且错误响应没有正确使用CORS。
  • 通过 die(),你没有返回正确的 http 响应吗?让它返回一些东西或回显 Laravel 的 Response 对象
  • 我认为这不是问题,因为我收到了来自工作控制器的test 响应。此外,Angular 在发送GET 请求之前先发送OPTIONS 请求,对于任何不是PackingController 的控制器,它会到达GET,但对于那个控制器则不然
  • 如果去掉 PublishPackingRequest use 语句(假设没有使用该类的代码),是否还会出现同样的错误?
  • 不,但奇怪的是,当我按照上面的编辑复制控制器时,我确实必须创建一个新的请求文件,因为我收到一个 Laravel 错误,它找不到 PublishPackingRequest 类。然而,当我重命名文件并将类名等重命名为 PublishPackingRequest (extra n) 时,新文件再次起作用。 Packing 的工作存在一些问题。我想看看我是否复制了一些东西,但还没有运气

标签: php angularjs laravel laravel-5


【解决方案1】:

看起来您的控制器可能卡在命名空间自动加载缓存中?我会尝试以下方法来解决它,从

开始
composer -o dump-autoload

然后做一次路由缓存刷新

php artisan route:cache

然后最后通过使用检查路由是否真的存在

php artisan route:list  

我还会检查您是否可以看到 CORS 中间件正在应用于路由,因为您没有将它用作全局中间件。它应该像下图中中间件部分下的“oauth,api.company,api.user”一样出现

如果这不能解决问题,那么我会检查控制器的 Camel 外壳的顺序是否正确,从 Actions 部分匹配它是 route:list

【讨论】:

    【解决方案2】:

    为了使包正常工作,请求必须是有效的 CORS 请求并且需要包含“Origin”标头。

    发生错误时,中间件未完全运行。因此,发生这种情况时,您不会看到实际结果,而是会收到 CORS 错误。

    检查您的操作是否正确无误。

    【讨论】:

      【解决方案3】:

      我一直遇到同样的问题,我的所有路由都可以正常工作,但只有一个,而且我知道该路由及其控制器可以正常工作,因为我使用 Postman 对其进行了测试。实际发生的是,我的 Angular (5) 出于某种原因自动将请求类型设置为 OPTIONS(我正在发送 JSON)。将其更改为 POST 为我解决了这个问题,我通过根据应用程序中的所有其他 POST 请求发送 FormData 来做到这一点。 始终检查您的网络标签

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2015-09-26
        • 1970-01-01
        • 2016-01-26
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 2017-04-23
        相关资源
        最近更新 更多