58

我想为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);`

因此,可以在全局范围内完成,而不是为每个路由编写这个,以便为每个视图设置标题。

我尝试通过创建后过滤器来设置标题,但没有让它工作。

谁能告诉我在哪里可以为所有视图设置标题?

更新 我的视图文件元内容之一

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

现在,当我使用Redirect::to('/',301,$headers) 萤火虫中的标头时

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
4

7 回答 7

42

在 Laravel 5 中,使用中间件,创建新文件,修改现有文件:

新文件: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;
    }
}

修改现有文件app/Kernel.php

protected $middleware = [
.
.
.

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

你已经准备好了。

于 2015-07-23T12:01:05.910 回答
38

有几种不同的方法可以做到这一点 - 都有优点/缺点。

选项 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 将标题绑定到应用程序中的所有视图。

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);
}); 

然后只需在您的视图中回显 $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');
}); 
于 2013-07-09T14:00:07.290 回答
29

在 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"');
});
于 2013-08-08T09:37:00.560 回答
11

在 Laravel 5 中,您可以更改 /public/index.php 第 55 行并为整个应用程序设置标题:

$response->send();

和:

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

为essample。

于 2015-07-23T10:41:41.023 回答
8

对于使用 Laravel 5.x 的未来读者,这可以开箱即用,无需创建任何自定义中间件

Laravel 有response()helper 方法,你可以很容易地将 headers 链接到它。

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, 等等。

于 2016-02-04T19:19:32.363 回答
7

对于 Laravel >= 5.2,遵循@Amarnasan answer ,尽管我使用我的 API 调用

在 Laravel 5 中,使用中间件,创建新文件,修改现有文件:

新文件: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;
    }
}

修改现有文件 app/Kernel.php 以便您可以与每个特定路由一起使用

protected $routeMiddleware = [
.
.
.

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

And you're set.

然后你可以像这样将它用于单个路由或组

$api->get('cars/all', 'MyController@index')->middleware(['myHeader']);;
于 2016-06-10T05:07:46.520 回答
5

在 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 附加。

于 2014-07-28T12:43:57.223 回答