Laravel 请求通过错误的中间件进行路由
Laravel request being routed through wrong middleware
我想在我的应用程序上的所有回复中添加一个 http 回复 header。我刚刚创建了一个新的中间件,以便按如下方式执行此操作:
namespace Ibbr\Http\Middleware;
use Closure;
class XFrameOptionsHeader
{
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('X-Frame-Options', 'deny');
return $response;
}
}
然后,添加到我的Kernel.php
protected $middlewareGroups = [
'web' => [
\Ibbr\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Ibbr\Http\Middleware\VerifyCsrfToken::class,
\Ibbr\Http\Middleware\XFrameOptionsHeader::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \Ibbr\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verificaCookieArquivo' => \Ibbr\Http\Middleware\VerificaCookieArquivo::class,
'xFrameOptionsHeader' => \Ibbr\Http\Middleware\XFrameOptionsHeader::class,
]
在路由定义中我有:
Route::group(['middleware'=>['verificaCookieArquivo']], function(){
Route::get('/storage/{filename}', 'PagesController@getArquivo');
});
Route::group(['middleware'=>['web','xFrameOptionsHeader']], function(){
Route::get('/', 'PagesController@getIndex');
// more routes...
});
每当我调用第二组中的任何路由 ['web','xFrameOptionsHeader']
它正常工作并且 return 新的 http header。但是,当我调用路由 /storage/{filename}
时,它失败并显示错误
Call to undefined method
Symfony\Component\HttpFoundation\BinaryFileResponse::header()
所以首先在考虑 header 函数在这个上下文中是否存在之前,我觉得更奇怪的是这个中间件甚至在我认为它只会调用的情况下被调用verificaCookieArquivo
中期。为什么会出现这种情况,如何解决?顺便说一句,我使用的是 laravel-5.7,但它没有标签。
只需从您的 web
中间件组中删除 \Ibbr\Http\Middleware\XFrameOptionsHeader::class,
。
web
中间件组自动应用于 routes/web.php
。这就是为什么中间件 运行 on:
Route::group(['middleware'=>['verificaCookieArquivo']], function(){
Route::get('/storage/{filename}', 'PagesController@getArquivo');
});
此外,您也不需要在下一个路由组中指定web
:
Route::group(['middleware'=>['web','xFrameOptionsHeader']], function(){
// ^-- Remove this
Route::get('/', 'PagesController@getIndex');
// more routes...
});
参考:https://laravel.com/docs/5.6/middleware#middleware-groups
我想在我的应用程序上的所有回复中添加一个 http 回复 header。我刚刚创建了一个新的中间件,以便按如下方式执行此操作:
namespace Ibbr\Http\Middleware;
use Closure;
class XFrameOptionsHeader
{
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('X-Frame-Options', 'deny');
return $response;
}
}
然后,添加到我的Kernel.php
protected $middlewareGroups = [
'web' => [
\Ibbr\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Ibbr\Http\Middleware\VerifyCsrfToken::class,
\Ibbr\Http\Middleware\XFrameOptionsHeader::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \Ibbr\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verificaCookieArquivo' => \Ibbr\Http\Middleware\VerificaCookieArquivo::class,
'xFrameOptionsHeader' => \Ibbr\Http\Middleware\XFrameOptionsHeader::class,
]
在路由定义中我有:
Route::group(['middleware'=>['verificaCookieArquivo']], function(){
Route::get('/storage/{filename}', 'PagesController@getArquivo');
});
Route::group(['middleware'=>['web','xFrameOptionsHeader']], function(){
Route::get('/', 'PagesController@getIndex');
// more routes...
});
每当我调用第二组中的任何路由 ['web','xFrameOptionsHeader']
它正常工作并且 return 新的 http header。但是,当我调用路由 /storage/{filename}
时,它失败并显示错误
Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()
所以首先在考虑 header 函数在这个上下文中是否存在之前,我觉得更奇怪的是这个中间件甚至在我认为它只会调用的情况下被调用verificaCookieArquivo
中期。为什么会出现这种情况,如何解决?顺便说一句,我使用的是 laravel-5.7,但它没有标签。
只需从您的 web
中间件组中删除 \Ibbr\Http\Middleware\XFrameOptionsHeader::class,
。
web
中间件组自动应用于 routes/web.php
。这就是为什么中间件 运行 on:
Route::group(['middleware'=>['verificaCookieArquivo']], function(){
Route::get('/storage/{filename}', 'PagesController@getArquivo');
});
此外,您也不需要在下一个路由组中指定web
:
Route::group(['middleware'=>['web','xFrameOptionsHeader']], function(){
// ^-- Remove this
Route::get('/', 'PagesController@getIndex');
// more routes...
});
参考:https://laravel.com/docs/5.6/middleware#middleware-groups