Запрос Laravel направляется через неправильное промежуточное ПО

Я хочу добавить заголовок ответа http ко всем моим ответам в моем приложении. Я только что создал новое промежуточное ПО, чтобы сделать это следующим образом:

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'], он работает нормально и возвращает новый заголовок http. Но когда я вызываю маршрут /storage/{filename}, он терпит неудачу с ошибкой

Вызов неопределенного метода Symfony\Component\HttpFoundation\BinaryFileResponse::header()

Итак, прежде всего, прежде чем рассматривать, существует ли функция заголовка в этом контексте, я нахожу более странным, что это промежуточное ПО даже вызывается в этой ситуации, когда я думал, что оно вызовет только verificaCookieArquivo mid. Почему это происходит и как решить? Кстати, я использую laravel-5.7, но для этого нет тега.


person Fabiotk    schedule 03.09.2018    source источник
comment
могу я увидеть весь middlewareGroups?   -  person Wreigh    schedule 03.09.2018
comment
Во многих случаях добавление web промежуточного программного обеспечения решает проблему.'middleware'=>['web','verificaCookieArquivo']   -  person Saman    schedule 03.09.2018
comment
@Wreigh Я добавил это в ОП.   -  person Fabiotk    schedule 03.09.2018
comment
@Saman Я пробовал это, но тоже не сработало   -  person Fabiotk    schedule 03.09.2018


Ответы (1)


просто удалите \Ibbr\Http\Middleware\XFrameOptionsHeader::class, из ваших web групп промежуточного программного обеспечения.

Группа промежуточного программного обеспечения web автоматически применяется к routes/web.php. Вот почему промежуточное ПО запускается:

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< /а>

person Wreigh    schedule 04.09.2018