Perl 如何为Catalyst中的每个响应设置缓存控制标头?
默认情况下,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
缓存控制:
等标题。我知道我可以在给定的控制器方法中输出它们,如下所示:
$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