Где я могу установить заголовки в 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
Ответы
Ответ 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
и т.д.