1

我在 CodeIgniter 中有一个动态内容控制器,可以从 GridFS 中提取图像。服务器正在运行 nginx,我正在尝试在我的 nginx 配置中设置缓存控制标头,以将此动态内容控制器提供的图像缓存 7 天。我在我的 nginx 配置中正确设置了配置,但是我从 nginx 获得了 404 标头,因为这些文件实际上并不存在于服务器上。

我的缓存控制指令如下:

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 7d;
    log_not_found off;
}

log_not_found 有助于防止 nginx 记录 404 错误,但发送到浏览器的标头仍然是 404 错误。我尝试通过 php 的“header”函数手动设置标题,但是因为 nginx 使用的是 php-fpm,所以它做了一些奇怪的事情。

谁能指出我如何正确设置缓存控制标头以应对这种情况?谢谢大家 =)

更新:

我将我的 nginx conf 更改为所有静态文件和动态控制器的特殊位置。

location ~ ^/(dres|js|css|art)/ {
    access_log off;
    expires 7d;
    add_header Cache-Control public;
    try_files $uri $uri/ /index.php?$args;
}

Nginx 正在静态文件上设置正确的过期标头,但我无法让 fastcgi 和 nginx 为动态输出图像输出过期标头。在提供 php 文件时,我的 fastcgi 配置中必须缺少某些内容以允许过期标头。

4

2 回答 2

0

你不应该为此设置fastcgi_cache吗?

于 2011-12-20T03:56:25.257 回答
0

解决了大部分。意识到使用 php 的“header”功能是有效的,还有其他问题让我认为它不是。我刚刚将它添加到我的动态图像控制器中:

// seconds, minutes, hours, days
$expires = (60*60*24*7);
header("Pragma: public");
header("Cache-Control: maxage=".$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');       

现在至少到期工作就像我想要的动态图像一样。我还没有弄清楚如何在没有在这些动态图像上获得 404 的情况下指定静态文件的过期时间,但现在这更好。

于 2011-12-20T22:03:09.020 回答