Подтвердить что ты не робот

Где я могу установить заголовки в laravel

Я хочу установить заголовки как array('Cache-Control'=>'no-cache, no-store, max-age=0, must-revalidate','Pragma'=>'no-cache','Expires'=>'Fri, 01 Jan 1990 00:00:00 GMT'); для всех моих просмотров, в настоящее время я делаю это во всех контроллерах при возврате просмотров, например

$headers=array('Cache-Control'=>'no-cache, no-store, max-age=0, must-revalidate','Pragma'=>'no-cache','Expires'=>'Fri, 01 Jan 1990 00:00:00 GMT');

Redirect::to('/',301,$headers);`

Поэтому вместо того, чтобы записывать это для каждого маршрута, это можно сделать в глобальной области, чтобы заголовки были настроены для каждого представления.

Я попытался настроить заголовки, создав после фильтра, но не смог заставить его работать.

Может ли кто-нибудь сказать мне, где я могу установить заголовки для всех моих просмотров?

UPDATE Один из моих метафайлов файла просмотра

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>

Теперь, когда я использую Redirect::to('/',301,$headers) Заголовок в firebug -

Cache-Control   max-age=0, must-revalidate, no-cache, no-store, private
Connection  Keep-Alive
Content-Type    text/html; charset=UTF-8
Date    Tue, 09 Jul 2013 14:52:08 GMT
Expires Fri, 01 Jan 1990 00:00:00 GMT

И когда я использую Redirect::to('/');

Заголовок в firebug

Cache-Control   no-cache
Connection  Keep-Alive
Content-Type    text/html; charset=UTF-8
Date    Tue, 09 Jul 2013 14:52:08 GMT
4b9b3361

Ответ 1

Есть несколько способов, которыми вы могли бы это сделать: все они имеют преимущества/недостатки.

Вариант 1 (простой): Поскольку массив - это только статические данные - просто вручную поместите заголовки в свои макеты просмотра напрямую - т.е. Не передавайте их из любого места - код прямо в вашем представлении.

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>

Вариант 2: Используйте просмотр композиторов. Вы можете использовать приложение перед фильтром, чтобы привязать заголовок ко всем представлениям в вашем приложении.

App::before(function($request)  
{
     $headers=array('Cache-Control'=>'no-cache, no-store, max-age=0, must-revalidate','Pragma'=>'no-cache','Expires'=>'Fri, 01 Jan 1990 00:00:00 GMT');

     View::share('headers', $headers);
}); 

Затем просто выделите заголовки $в ваших представлениях.

Примечание: вы должны позволить представлению задавать заголовки - вот почему мы "передаем" заголовок в поле зрения для Laravel для обработки. Если вы попытаетесь вывести сам заголовок из фильтра или что-то еще, вы вызовете проблемы.

Изменить вариант 3: Я только что узнал об этом - вы можете попробовать это

App::before(function($request)  
{
     Response::header('Cache-Control', 'nocache, no-store, max-age=0, must-revalidate');
     Response::header('Pragma', 'no-cache');
     Response::header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
}); 

Ответ 2

В Laravel 4 это работает для меня:

В filters.php:

App::after(function($request, $response)
{
   $response->headers->set('key','value');
});

Как

App::after(function($request, $response)
{
   $response->headers->set('P3P','CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"');
});

Ответ 3

В Laravel 5, используя Middleware, создайте новый файл, изменив существующий файл:

Новый файл: приложение /Http/Middleware/AddHeaders.php

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

// If Laravel >= 5.2 then delete 'use' and 'implements' of deprecated Middleware interface.
class AddHeaders implements Middleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->header('header name', 'header value');
        $response->header('another header', 'another value');

        return $response;
    }
}

Изменить существующий файл app/Kernel.php

protected $middleware = [
.
.
.

        'App\Http\Middleware\AddHeaders',
    ];

И вы настроены.

Ответ 4

Работа над Laravel 4.2. Я использую фильтр для этого, поэтому в filters.php у меня есть:

Route::filter('no-cache',function($route, $request, $response){

    $response->header("Cache-Control","no-cache,no-store, must-revalidate");
    $response->header("Pragma", "no-cache"); //HTTP 1.0
    $response->header("Expires"," Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

});

Чем я прикреплю этот фильтр к маршрутам или контроллерам. Приложенный контроллер выглядит так для меня:

public function __construct() {

        $this->beforeFilter('onestep',array('except' => 'getLogin'));
        $this->beforeFilter('csrf',array('on' => 'post'));
        $this->afterFilter("no-cache", ["only"=>"getIndex"]);
    }

Этот фильтр прикреплен как afterFilter.

Ответ 5

В Laravel 5 вы можете изменить /public/index.php строку 55 и настроить заголовок для всего приложения:

$response->send();

с:

$response->header('Content-Type','text/html; charset=ISO-8859-1')->send();

для essample.

Ответ 6

Для Laravel >= 5.2, но после ответа @Amarnasan, хотя я использовал мои вызовы API

В Laravel 5, используя Middleware, создайте новый файл, изменив существующий файл:

Новый файл: app/Http/Middleware/AddHeaders.php

<?php 
namespace App\Http\Middleware;
use Closure;
use Illuminate\Routing\Redirector;
use Illuminate\Http\Request;
use Illuminate\Foundation\Applicaion;


class AddHeaders 
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->header('Cache-Control', 'max-age=36000, public');
        //$response->header('another header', 'another value');

        return $response;
    }
}

Измените существующее файловое приложение /Kernel.php, чтобы вы могли использовать с каждым конкретным маршрутом

protected $routeMiddleware = [
.
.
.

        'myHeader' => \App\Http\Middleware\AddHeaders::class,
    ];

And you're set.

Затем вы можете использовать его так же для отдельных маршрутов или групп

$api->get('cars/all', '[email protected]')->middleware(['myHeader']);;

Ответ 7

Для будущих читателей, использующих Laravel 5.x, это можно обработать из коробки без необходимости создания специального промежуточного программного обеспечения.

Laravel имеет вспомогательный метод response(), который вы можете легко связать с заголовками.

use Response;
// Or possibly: use Illuminate\Http\Response; depending on your aliases used.

// Add a series of headers
return response($content)
    ->header('Content-Type', 'text/xml')
    ->header('X-Header-One', 'Header Value');

// Or use withHeaders to pass array of headers to be added
return response($content)
    ->withHeaders([
        'Content-Type' => 'text/xml',
        'X-Header-One' => 'Header Value'
    ]);

Подробнее об этом читайте в документации, поскольку он может обрабатывать множество вещей; cookies, views и т.д.