Назад | Перейти на главную страницу

Условное изменение типа MIME в nginx

Я использую nginx в качестве интерфейса для Rails. Все страницы кешируются как .html файлы на диске, и nginx обслуживает эти файлы, если они существуют. Я хочу отправить правильный тип MIME для каналов (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.

Спасибо.

Мой совет: переходите на Nginx 0.7.x и используйте try_files и proxy_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 кэширует его.