在 nginx 中有条件地更改 MIME 类型

在 nginx 中有条件地更改 MIME 类型

我使用 nginx 作为 Rails 的前端。所有页面都缓存为.html磁盘上的文件,如果这些文件存在,nginx 就会提供这些文件。我想发送正确的 MIME 类型来获取 feeds ( application/rss+xml),但目前我使用的方法相当丑陋,我想知道是否有更简洁的方法。

这是我的配置:

location ~ /feed/$ {
  types {}
  default_type application/rss+xml;
  root /var/www/cache/;
  if (-f request_filename/index.html) {
    rewrite (.*) $1/index.html break;
  }
  if (-f request_filename.html) {
    rewrite (.*) $1.html break;
  }
  if (-f request_filename) {
    break;
  }
  if (!-f request_filename) {
    proxy_pass http://mongrel;
    break;
  }

}

location / {
  root /var/www/cache/;
  if (-f request_filename/index.html) {
    rewrite (.*) $1/index.html break;
  }
  if (-f request_filename.html) {
    rewrite (.*) $1.html break;
  }
  if (-f request_filename) {
    break;
  }
  if (!-f request_filename) {
    proxy_pass http://mongrel;
    break;
  }
}

我的问题:

  1. 有没有更好的方法来更改 MIME 类型?所有缓存文件都有.html扩展名,我无法更改这一点。
  2. 有没有办法将和if中的条件分解出来?我知道我可以使用,但我希望有更好的方法。将部分配置放在不同的文件中不太容易理解。/feed/$/include
  3. 您能发现这些if条件中的任何错误吗?

我正在使用 nginx 0.6.32 (Debian Lenny)。我更喜欢使用 APT 中的版本。

谢谢。

答案1

我的建议:继续使用 Nginx 0.7.x 并使用try_filesproxy_cache,它将大大简化您的设置。try_files旨在排除重复的if (-f语句:

location / {
  try_files $uri/index.html $uri.html $uri @mongrel
}

location @mongrel {
  proxy_pass http://mongrel;
}

至于 MIME 类型,如果您使用proxy_cache,您可以从应用程序返回 MIME 类型并且 Nginx 会缓存它。

相关内容