在 Laravel 5.3 护照中添加 Access-Control-Allow-Origin header 回复
Adding Access-Control-Allow-Origin header response in Laravel 5.3 Passport
我是 Laravel 的新手,正在做一些 Laravel 5.3 Passport 项目,其中包含 OAuth2.0 密码授权。当我用参数卷曲 API 时,它会用令牌响应。但是,在浏览器中,它需要端点应添加的额外安全性,因为我的请求来自本地主机,而 API 位于我的 VM 中。这是错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 400.
我知道问题出在哪里,但我不知道该把它放在哪里 header 因为这是第三方应用程序。
先谢谢各位专家了。请帮忙。
简单的答案是将 Access-Control-Allow-Origin
header 设置为 localhost
或 *
。以下是我通常的做法:
创建一个名为 Cors
的简单中间件:
php artisan make:middleware Cors
将以下代码添加到 app/Http/Middleware/Cors.php
:
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
}
您可以将 *
替换为 localhost
或保持原样。
下一步是加载中间件。将以下行添加到 app/Http/Kernel.php
中的 $routeMiddleware
数组。
'cors' => \App\Http\Middleware\Cors::class,
最后一步是在要设置访问源 header 的路由上使用中间件。假设你正在谈论 laravel 5.3 中的新 api 路由,那么在 app/Providers/RouteServiceProvider.php
的 mapApiRoutes()
函数中(你可以删除或注释之前的代码函数):
Route::group([
'middleware' => ['api', 'cors'],
'namespace' => $this->namespace,
'prefix' => 'api',
], function ($router) {
//Add you routes here, for example:
Route::apiResource('/posts','PostController');
});
您也可以使用很棒的 laravel-cors package by barryvdh。
安装包后,为所有路由获取 CORS 支持的最简单方法是在 Http/Kernel.php:
中添加这样的中间件
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Barryvdh\Cors\HandleCors::class,
];
如果您不想在所有路由上都支持 CORS,您应该为 /oauth/token
创建一个新的 OPTIONS 路由,并仅将 cors 中间件添加到该路由。
编辑 Laravel 8
Laravel 8 已经内置了 CORS 支持 - HandleCors
中间件在全局 middleware stack by default 中定义并且可以在应用程序的 config/cors.php
配置文件中进行配置。
如果您更新 Laravel 应用程序,请务必使用提供的中间件更改 barryvdh 的包:\Fruitcake\Cors\HandleCors::class
请注意,您无法修改预检。
另外,浏览器(至少chrome)去掉了"authorization" header ...这导致根据路由设计可能出现的一些问题。例如,预检将永远不会进入护照路线 sheet,因为它没有带有令牌的 header。
如果您正在设计一个实现了选项方法的文件,您必须在路由文件中定义web.php一个(或多个)"trap"路由,以便preflght (无需header授权)即可解析请求并获取对应的CORS header。
因为默认情况下他们不能在中间件 200 中 return,所以他们必须在原始请求中添加 header。
简单的答案是将 Access-Control-Allow-Origin header 设置为 localhost 或 *。以下是我通常的做法:
将以下代码添加到bootstrap/app。php:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Headers: *');
警告:仅在您的开发环境中执行此操作。
没有解决App\Http\Kernel
中设置路由中间件的问题,尝试设置全局中间件。在 App\Http\Middleware\Cors
:
public function handle($request, Closure $next)
{
return $next($request)->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods','GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS')
->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}
在App\Http\Kernel
中:
protected $middleware = [
...
\App\Http\Middleware\Cors::class,
];
只需将此添加到您的视图中:
<?php header("Access-Control-Allow-Origin: *"); ?>
在 App/Http/Middleware 中创建一个 Cors.php 文件并将其粘贴到其中。 ☑
<?php
namespace App\Http\Middleware;
use Closure;
class Cors { public function handle($request, Closure $next)
{
header("Access-Control-Allow-Origin: *");
//ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods' => 'POST,GET,OPTIONS,PUT,DELETE',
'Access-Control-Allow-Headers' => 'Content-Type, X-Auth-Token, Origin, Authorization',
];
if ($request->getMethod() == "OPTIONS"){
//The client-side application can set only headers allowed in Access-Control-Allow-Headers
return response()->json('OK',200,$headers);
}
$response = $next($request);
foreach ($headers as $key => $value) {
$response->header($key, $value);
}
return $response;
} }
并在 "Trust Proxies::Class" 行之后的 Kernel.php 中添加此行。
\App\Http\Middleware\Cors::class,
就是这样,你已经允许了所有 Cors Header。 ☑
只需将此添加到您的代码控制器
return response()->json(compact('token'))->header("Access-Control-Allow-Origin", "*");
如果您已应用 CORS 中间件但它仍然无法正常工作,请尝试此操作。
如果您 API 的路线是:
Route::post("foo", "MyController"})->middleware("cors");
然后您需要更改它以允许使用 OPTIONS 方法:
Route::match(['post', 'options'], "foo", "MyController")->middleware("cors");
之后
https://github.com/fruitcake/laravel-cors
我必须更改 cors.php 文件如下
* Sets the Access-Control-Allow-Credentials header.
*/
'supports_credentials' => true,
只需几个步骤即可将 Access-Control-Allow-Origin
header 添加到 localhost or *.
第 1 步:创建 Cors 中间件:
php artisan make:middleware Cors
第 2 步:像这样在 Cors 中间件中设置 header
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
第 3 步:我们需要在 app/Http/Kernel.php
中添加 Cors class
protected $middleware = [
....
\App\Http\Middleware\Cors::class,
];
这里不需要检查任何中间件
因为我们在 app/Http/Kernel.php
中的 $middleware
中添加了 Cors class
工作解决方案
第 1 步:创建 Cors 中间件
php artisan make:middleware Cors
第 2 步:在句柄函数内的 Cors 中间件中设置 header
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
第 3 步:在 app/Http/Kernel 中添加 Cors class。php
protected $routeMiddleware = [
....
'cors' => \App\Http\Middleware\Cors::class,
];
第 4 步:替换 app/providers/routeServiceProvider.php
中的 mapApiRoutes
Route::prefix('api')
->middleware(['api', 'cors'])
->namespace($this->namespace)
->group(base_path('routes/api.php'));
第 5 步:在 routes/api.php
中添加您的路线
Route::post('example', 'controllerName@functionName')->name('example');
如果由于某种原因它仍然无法正常工作。
Laravel 的第一个选项
任何应用程序的第二个选项
第一个选项:
如上例,我们创建中间件
php artisan make:middleware Cors
将以下代码添加到app/Http/Middleware/Cors.php
:
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
->header('Access-Control-Allow-Headers', 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range');
}
仔细看,表头的数据量->header('Access-Control-Allow-Headers',
第三步,在[=18=]
中的$routeMiddleware
数组中添加中间件
protected $routeMiddleware = [
....
'cors' => \App\Http\Middleware\Cors::class,
];
第二个选项:
打开您域的 nginx.conf 设置。
sudo nano /etc/nginx/sites-enabled/your-domain.conf
在服务器设置里面服务器{ listen 80; .... }
请添加以下代码:
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
我正在使用 Laravel 8 并且刚刚安装了 fruitcake/laravel-cors
并在 app/Http/Kernel.php
中使用它,就像打击一样:
protected $middleware = [
....
\Fruitcake\Cors\HandleCors::class,
];
注意: 像我一样把它添加到数组的末尾
在 bootstrap/app 中添加 headers 即可轻松完成。php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Headers: *');
您不需要做任何额外的事情。 Laravel 已经有内置的规定 - 从这里阅读
我是 Laravel 的新手,正在做一些 Laravel 5.3 Passport 项目,其中包含 OAuth2.0 密码授权。当我用参数卷曲 API 时,它会用令牌响应。但是,在浏览器中,它需要端点应添加的额外安全性,因为我的请求来自本地主机,而 API 位于我的 VM 中。这是错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 400.
我知道问题出在哪里,但我不知道该把它放在哪里 header 因为这是第三方应用程序。
先谢谢各位专家了。请帮忙。
简单的答案是将 Access-Control-Allow-Origin
header 设置为 localhost
或 *
。以下是我通常的做法:
创建一个名为 Cors
的简单中间件:
php artisan make:middleware Cors
将以下代码添加到 app/Http/Middleware/Cors.php
:
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
}
您可以将 *
替换为 localhost
或保持原样。
下一步是加载中间件。将以下行添加到 app/Http/Kernel.php
中的 $routeMiddleware
数组。
'cors' => \App\Http\Middleware\Cors::class,
最后一步是在要设置访问源 header 的路由上使用中间件。假设你正在谈论 laravel 5.3 中的新 api 路由,那么在 app/Providers/RouteServiceProvider.php
的 mapApiRoutes()
函数中(你可以删除或注释之前的代码函数):
Route::group([
'middleware' => ['api', 'cors'],
'namespace' => $this->namespace,
'prefix' => 'api',
], function ($router) {
//Add you routes here, for example:
Route::apiResource('/posts','PostController');
});
您也可以使用很棒的 laravel-cors package by barryvdh。
安装包后,为所有路由获取 CORS 支持的最简单方法是在 Http/Kernel.php:
中添加这样的中间件protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Barryvdh\Cors\HandleCors::class,
];
如果您不想在所有路由上都支持 CORS,您应该为 /oauth/token
创建一个新的 OPTIONS 路由,并仅将 cors 中间件添加到该路由。
编辑 Laravel 8
Laravel 8 已经内置了 CORS 支持 - HandleCors
中间件在全局 middleware stack by default 中定义并且可以在应用程序的 config/cors.php
配置文件中进行配置。
如果您更新 Laravel 应用程序,请务必使用提供的中间件更改 barryvdh 的包:\Fruitcake\Cors\HandleCors::class
请注意,您无法修改预检。 另外,浏览器(至少chrome)去掉了"authorization" header ...这导致根据路由设计可能出现的一些问题。例如,预检将永远不会进入护照路线 sheet,因为它没有带有令牌的 header。
如果您正在设计一个实现了选项方法的文件,您必须在路由文件中定义web.php一个(或多个)"trap"路由,以便preflght (无需header授权)即可解析请求并获取对应的CORS header。 因为默认情况下他们不能在中间件 200 中 return,所以他们必须在原始请求中添加 header。
简单的答案是将 Access-Control-Allow-Origin header 设置为 localhost 或 *。以下是我通常的做法:
将以下代码添加到bootstrap/app。php:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Headers: *');
警告:仅在您的开发环境中执行此操作。
没有解决App\Http\Kernel
中设置路由中间件的问题,尝试设置全局中间件。在 App\Http\Middleware\Cors
:
public function handle($request, Closure $next)
{
return $next($request)->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods','GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS')
->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}
在App\Http\Kernel
中:
protected $middleware = [
...
\App\Http\Middleware\Cors::class,
];
只需将此添加到您的视图中:
<?php header("Access-Control-Allow-Origin: *"); ?>
在 App/Http/Middleware 中创建一个 Cors.php 文件并将其粘贴到其中。 ☑
<?php
namespace App\Http\Middleware;
use Closure;
class Cors { public function handle($request, Closure $next)
{
header("Access-Control-Allow-Origin: *");
//ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods' => 'POST,GET,OPTIONS,PUT,DELETE',
'Access-Control-Allow-Headers' => 'Content-Type, X-Auth-Token, Origin, Authorization',
];
if ($request->getMethod() == "OPTIONS"){
//The client-side application can set only headers allowed in Access-Control-Allow-Headers
return response()->json('OK',200,$headers);
}
$response = $next($request);
foreach ($headers as $key => $value) {
$response->header($key, $value);
}
return $response;
} }
并在 "Trust Proxies::Class" 行之后的 Kernel.php 中添加此行。
\App\Http\Middleware\Cors::class,
就是这样,你已经允许了所有 Cors Header。 ☑
只需将此添加到您的代码控制器
return response()->json(compact('token'))->header("Access-Control-Allow-Origin", "*");
如果您已应用 CORS 中间件但它仍然无法正常工作,请尝试此操作。
如果您 API 的路线是:
Route::post("foo", "MyController"})->middleware("cors");
然后您需要更改它以允许使用 OPTIONS 方法:
Route::match(['post', 'options'], "foo", "MyController")->middleware("cors");
之后
https://github.com/fruitcake/laravel-cors
我必须更改 cors.php 文件如下
* Sets the Access-Control-Allow-Credentials header.
*/
'supports_credentials' => true,
只需几个步骤即可将 Access-Control-Allow-Origin
header 添加到 localhost or *.
第 1 步:创建 Cors 中间件:
php artisan make:middleware Cors
第 2 步:像这样在 Cors 中间件中设置 header
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
第 3 步:我们需要在 app/Http/Kernel.php
protected $middleware = [
....
\App\Http\Middleware\Cors::class,
];
这里不需要检查任何中间件
因为我们在 app/Http/Kernel.php
$middleware
中添加了 Cors class
工作解决方案
第 1 步:创建 Cors 中间件
php artisan make:middleware Cors
第 2 步:在句柄函数内的 Cors 中间件中设置 header
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
第 3 步:在 app/Http/Kernel 中添加 Cors class。php
protected $routeMiddleware = [
....
'cors' => \App\Http\Middleware\Cors::class,
];
第 4 步:替换 app/providers/routeServiceProvider.php
中的 mapApiRoutesRoute::prefix('api')
->middleware(['api', 'cors'])
->namespace($this->namespace)
->group(base_path('routes/api.php'));
第 5 步:在 routes/api.php
中添加您的路线Route::post('example', 'controllerName@functionName')->name('example');
如果由于某种原因它仍然无法正常工作。 Laravel 的第一个选项 任何应用程序的第二个选项
第一个选项:
如上例,我们创建中间件
php artisan make:middleware Cors
将以下代码添加到
app/Http/Middleware/Cors.php
:public function handle($request, Closure $next) { return $next($request) ->header('Access-Control-Allow-Origin', '*') ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS') ->header('Access-Control-Allow-Headers', 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'); }
仔细看,表头的数据量->header('Access-Control-Allow-Headers',
第三步,在[=18=]
中的$routeMiddleware
数组中添加中间件protected $routeMiddleware = [ .... 'cors' => \App\Http\Middleware\Cors::class, ];
第二个选项:
打开您域的 nginx.conf 设置。
sudo nano /etc/nginx/sites-enabled/your-domain.conf
在服务器设置里面服务器
{ listen 80; .... }
请添加以下代码:add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
我正在使用 Laravel 8 并且刚刚安装了 fruitcake/laravel-cors
并在 app/Http/Kernel.php
中使用它,就像打击一样:
protected $middleware = [
....
\Fruitcake\Cors\HandleCors::class,
];
注意: 像我一样把它添加到数组的末尾
在 bootstrap/app 中添加 headers 即可轻松完成。php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Headers: *');
您不需要做任何额外的事情。 Laravel 已经有内置的规定 - 从这里阅读