Php Laravel上的CORS(访问控制允许原点)

Php Laravel上的CORS(访问控制允许原点),php,laravel,laravel-5,cors,Php,Laravel,Laravel 5,Cors,我在AngularJS中创建了一个应用程序,并尝试调用Laravel API: MyApp(AngularJS): API(拉威尔样板): 我使用Laravel来编写API 但我在浏览器控制台中遇到了以下错误: 无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“” 我试图在api_routes.php中应用cors中间件(barryvdh/laravel cors),但错误仍然存在 api_routes

我在AngularJS中创建了一个应用程序,并尝试调用Laravel API:

  • MyApp(AngularJS):
  • API(拉威尔样板):
我使用Laravel来编写API

但我在浏览器控制台中遇到了以下错误:

无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”

我试图在api_routes.php中应用cors中间件(barryvdh/laravel cors),但错误仍然存在

api_routes.php:

<?php

$api = app('Dingo\Api\Routing\Router');

$api->version('v1', ['middleware' => 'cors'], function ($api) {

    $api->post('auth/login', 'App\Api\V1\Controllers\AuthController@login');
    $api->post('auth/signup', 'App\Api\V1\Controllers\AuthController@signup');
    $api->post('auth/recovery', 'App\Api\V1\Controllers\AuthController@recovery');
    $api->post('auth/reset', 'App\Api\V1\Controllers\AuthController@reset');

    // example of protected route
    $api->get('protected', ['middleware' => ['api.auth'], function () {     
        return \App\User::all();
    }]);

    // example of free route
    $api->get('free', function() {
        return \App\User::all();
    });

});

我对这个实现完全错了。
origin
头在Laravel中有一个特定的放置案例,在这个案例中,其他头可以在中间件中定义,
origin
不能

相反,您需要将其添加到主
routes.php
文件的顶部:

header('Access-Control-Allow-Origin: http://localhost:8080');

我不完全理解这一点,但当我需要跨浏览器访问时,我会将一个.htaccess文件添加到我的端点所在的文件夹中,其中包含以下内容:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

您应该添加一个nginx虚拟主机,通过代理传递指向您的api。基本上,您需要确保前端和后端都来自同一个域

您可以创建Cors中间件类并将其添加到kenel.php中的应用程序全局HTTP中间件堆栈中。此堆栈中的中间件将在应用程序的每个请求期间运行


尝试。

将此添加到
routes.php
文件或
api.php
文件的顶部,具体取决于您放置路由的位置:

header('Access-Control-Allow-Origin: http://localhost:8080');
header('Access-Control-Allow-Headers: origin, x-requested-with, content-type');
header('Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS');
在向其发出请求的站点中添加这3行代码可以解决CORS问题。以上内容将允许运行在上的JS向包含上述行的后端发出请求


答案来源于@Dallas Caley的答案。

大多数CORS问题都与服务器相关,如果.htaccess无法解决这个问题,您可以从application starter文件中给出相同的标题。所以要了解域名,其中是指向文件夹路径的应用程序。在Laravel index.php中,它是一个启动文件,因此请使用以下代码行和外接程序的起始行

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

在浏览器中缓存清除加载web应用所需的内容

Hi@ohgod为什么我尝试了此操作,请在回答问题后重试,错误仍然存在。我不知道AngularJS应用程序中有什么,我不需要更改任何内容,好吗?@MateusVitali查看我的更新,我刚刚做了一些测试,我发现必须在
routes.php
文件(或更早版本)中设置
Origin
头才能正确应用。可以在中间件中的响应上设置其他标头。我还不能100%确定原因,但这就是我发现的。试一试。更好的打印屏幕质量:@MateusVitali我可以看到标题在响应中提供给您,所以它工作正常!你能检查一下PHP错误并将其禁用吗?它阻止了服务器修改头文件,因为这是一个错误。但是我希望我可以把它放在不同的域中。