Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何为Catalyst中的每个响应设置缓存控制标头?_Perl_Caching_Http Headers_Catalyst - Fatal编程技术网

Perl 如何为Catalyst中的每个响应设置缓存控制标头?

Perl 如何为Catalyst中的每个响应设置缓存控制标头?,perl,caching,http-headers,catalyst,Perl,Caching,Http Headers,Catalyst,默认情况下,Catalyst似乎不输出缓存控制:等标题。我知道我可以在给定的控制器方法中输出它们,如下所示: $c->response->headers->last_modified(time); $c->response->headers->expires(time + $self->{cache_time}); $c->response->headers->header(cache_control => "public, ma

默认情况下,Catalyst似乎不输出
缓存控制:
等标题。我知道我可以在给定的控制器方法中输出它们,如下所示:

$c->response->headers->last_modified(time);
$c->response->headers->expires(time + $self->{cache_time});
$c->response->headers->header(cache_control => "public, max-age=$self->{cache_time}");
但是,在每种方法中都会非常痛苦!我更喜欢的是:

  • 一组默认标头(立即过期、上次修改、缓存控制:无缓存、pragma:无缓存)
  • 每个方法重写默认值的方法

有什么好办法可以做到这一点吗?

更新:根据您对我先前建议的回应,我决定咬紧牙关,看看Catalyst文档。在我看来,这样做的地方是:

  sub end : Private {
    my ( $self, $c ) = @_;

    # handle errors etc.

    if ( $c->res->body ) {
        if ( "some condition" ) {
            set_default_response_headers( $c->response->headers );
            return;
        }
        else {
            do_something_else();
            return;
        }
    }
    $c->forward( 'MyApp::View::TT' ); # render template
}
前面的回答:我不使用Catalyst,但您不能为您的应用程序编写sub吗

sub set_default_response_headers {
    my ($h) = @_;
    $h->last_modified(time);
    $h->expires(time + $self->{cache_time});
    $h->header(cache_control => "public, max-age=$self->{cache_time}");
    return $h;    
}
使用
set\u default\u response\u headers($c->response->headers)调用

好问题。我在Catalyst降临节日历的一份报告中完全涵盖了这一点

基本上,您创建一个stash变量来定义给定操作的缓存时间,然后在根端例程中处理它。有关所有详细信息,请参阅本文


JayK

是的,我可以写一个sub,但是我仍然需要记住在每个方法中调用它。。。如果它在任何控制器方法中被遗忘,则可能导致错误。这似乎是一个相当脆弱的方法。你可能想在这个答案中包含一个简短的片段。那个wiki目前没有为我加载(空白页面或连接重置),但我可以使用这个想法。谢谢如果没有设置缓存,我可以将其默认为无缓存。令人惊讶的是,这不是内置的催化剂;似乎每个Catalyst应用程序都必须这样做!好了,维基已经备份了。这是一个非常好的方法。这真的应该是Catalyst的一部分,或者至少是一个插件……人们使用Catalyst做很多不同的事情,一般来说,我们尽量避免在Catalyst核心中添加不必要的东西。这个方法非常简单,几乎不值得为它创建一个完整的附加组件。我们通常只是向人们指出该维基条目的方向,因为整个添加是12行,不包括注释:-D