【问题标题】:Serving dynamic content from Mongo GridFS via Nginx without a 404 error通过 Nginx 从 Mongo GridFS 提供动态内容而没有 404 错误
【发布时间】:2012-01-24 01:47:03
【问题描述】:

我在 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”函数手动设置 headers,但是因为 nginx 使用的是 php-fpm,所以它做了一些奇怪的事情。

任何人都可以为我指出正确的方向吗?如何为这种情况正确设置缓存控制标头?谢谢大家=)

更新:

我更改了我的 nginx 配置文件,为我的所有静态文件和动态控制器设置了一个特殊位置。

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 输出动态输出图像的过期标头。我必须在我的 fastcgi 配置中遗漏一些东西,以在提供 php 文件时允许过期标头。

【问题讨论】:

  • 我的动态内容的 uri 格式如下:example.com/controller/my_image_{imageid}.jpg 有一个重写,强制所有内容都通过站点的主 index.php 文件。如果我在重写到索引之前将该指令更改为我的控制器的路径,而不是匹配不存在文件的扩展名,那会防止 404 错误吗?
  • 这是我的完整配置:pastebin.com/sJ1vrkwF 是的,任何非静态的东西都通过 php 运行。感谢您的帮助 =)

标签: codeigniter mongodb nginx gridfs dynamic-image-generation


【解决方案1】:

你不应该为此设置fastcgi_cache吗?

【讨论】:

  • 我不是在尝试缓存文件服务器端,我只是尝试设置过期标头并告诉客户端浏览器缓存图像...
【解决方案2】:

大部分都解决了。意识到使用 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-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多