【问题标题】:Conditionally set expires headers in Apache config有条件地在 Apache 配置中设置过期标头
【发布时间】:2011-06-16 14:35:49
【问题描述】:

我想有条件地在图像上设置过期标头,以便它们在项目开发时不会缓存,但在生产时会缓存。理想情况下,这只是对 apache conf 文件的修改。我有一个会返回项目状态的 perl 脚本,它可以与 mod_rewrite 一起使用,如下所示:

rewritemap  PSTAT prg:/bin/pstat.pl
...skipping...
rewritecond ${PSTAT:$site:$1} =devel
rewriterule ^/run/$site/p(\d+)/(\w+) /logout.pl/$2 [NS,L]

如果我能做这样的事情就好了:

rewritecond ${PSTAT:$site:$1} =devel
ExpiresByType image/jpg "now plus 1 second"

虽然那当然行不通。

有什么解决办法吗?

【问题讨论】:

标签: apache mod-rewrite http-headers apache-config mod-expires


【解决方案1】:

对我有用的一个技巧是首先无条件设置标题:

ExpiresByType image/jpg "now plus 1 second"
...

然后在我们处于开发模式的情况下取消设置标题:

Header set Cache-control "no-cache" env=devel
Header unset expires env=devel

这要求您有一个先前根据您的模式初始化的布尔 env devel。在我们的例子中,我们决定是否要开发主机名(devel.domain.com 与 www.domain.com)。

【讨论】:

  • 目前,我们在开发和生产中使用相同的 URL,唯一知道区别的方法是 MySQL 数据库查询(mod_rewrite 中 perl 脚本的原因)我真的不想改变这一点;如果归根结底,我想我会放弃这个功能(开发中没有缓存)(或者改为更改我的后端脚本)。不过,这可能是解决方案的一部分,因此受到了好评。
  • 感谢您的回复,我找到了答案,因此我接受了这一点,然后将完整的答案添加为答案。
【解决方案2】:

从外星人哈德所说的开始,我设法想出了我的问题的答案。

rewritemap  PSTAT prg:/bin/pstat.pl
...skipping...
rewritecond ${PSTAT:$site:$1} =devel
rewriterule ^/images/(\d+)/(\w+) - [E=devel:1]

header set cache-control "no-cache" env=devel
header unset expires env=devel

/images/(\d+) 是特定项目编号(\d+) 的图像文件夹)

rewriteruleE 标志允许您在规则匹配的情况下设置环境变量。 - 实际上并没有重写任何东西。因此,这将使用rewritecond 将项目编号从rewriterule 发送给它来检查脚本的输出,然后在两个条件匹配的情况下设置环境变量。然后 header 根据该环境变量的存在有条件地设置。

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 2011-12-10
    • 2014-01-04
    • 2014-03-21
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多