I want to set headers as array(\'Cache-Control\'=>\'no-cache, no-store, max-age=0, must-revalidate\',\'Pragma\'=>\'no-cache\',\'Expires\'=>\'Fri, 01 Jan 1990
In Laravel 5 you can change /public/index.php line 55 and set your header for entire app:
$response->send();
with:
$response->header('Content-Type','text/html; charset=ISO-8859-1')->send();
for essample.
In Laravel 5, using Middleware, creating a new file, modifying an existing file:
New file: app/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;
}
}
Modify existing file app/Kernel.php
protected $middleware = [
.
.
.
'App\Http\Middleware\AddHeaders',
];
And you're set.
Working on Laravel 4.2. I'm using filter for this, so in filters.php i have:
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
});
Than I attach this filter to routes or controllers. Controller attached looks like this for me:
public function __construct() {
$this->beforeFilter('onestep',array('except' => 'getLogin'));
$this->beforeFilter('csrf',array('on' => 'post'));
$this->afterFilter("no-cache", ["only"=>"getIndex"]);
}
This filter is attached as afterFilter.
In Laravel 4, this works for me:
In filters.php:
App::after(function($request, $response)
{
$response->headers->set('key','value');
});
Like:
App::after(function($request, $response)
{
$response->headers->set('P3P','CP="NOI ADM DEV PSAi COM NAV OUR OTR STP IND DEM"');
});
For future readers using Laravel 5.x, this can be handled out of the box without needing to create any custom middleware.
Laravel has the response()
helper method, which you can chain headers to very easily.
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'
]);
Read more about it in the documentation, because it can handle attaching a number of things; cookies
, views
, and more.
There are a couple of different ways you could do this - all have advantages/disadvantages.
Option 1 (simple): Since the array is just static data - just manually put the headers in your view layouts directly - i.e. dont pass it from anywhere - code it straight in your view.
<?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
?>
Option 2: Use view composers. You can use an App before filter to bind the header to all views in your app.
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);
});
Then just echo out the $headers in your view(s).
Note: you must let the view set your headers - that is why we are 'passing' the header into view for Laravel to handle. If you try and output the header itself from within a filter or something, you'll cause issues.
Edit Option 3: I just found out about this - you could try this
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');
});