Как по расширению в url выставить правильный Content-Type?

Есть у меня куча файлов без расширения типа «/data/z1/13/bc/1-z1-13bcaf-45d7-1234567890»
Мне приходит в nginx ссылка вида 1-z1-13bcaf-45d7-1234567890.jpg (ну или другая, в любом случае я могу выделить имя файла и jpeg).
Rewrite из ссылки в физическое местоположение лёгок и строен. Проблема в mime.
Я хочу, чтобы, если придёт.jpg или.jpeg, выставлялся image/jpeg. Если придёт.doc, выставлялся application/msword, а придёт.hrenovina, то выставлялся application/octet-stream. Сейчас всегда ставится application/octet-stream, вне зависимости от расширения в url.

Перенаправлять запрос в отдельный location, и уже там делать rewrite?
Пользоваться каким-нибудь хитрым more_set_headers с переменными из реврайта?

Tagged with →  

14 Responses to Как по расширению в url выставить правильный Content-Type?

  1. WebDev:

    отдельные локейшны делать, конечно, больше никак

  2. AmtEkb:

    Stephan-V: да, так я уже сделал для нескольких расширений. После пятого мне это несколько надоело :-
    Не переписывать же весь mime.types в локейшены.

  3. AmtEkb:

    Может хотя бы есть способ запихнуть расширение в какую-то переменную?

  4. WebDev:

    переписывать, раз у тебя такая кривота с реальными именами

  5. AmtEkb:

    Stephan-V: да, переписал в итоге некоторые расширения (штук 30).

    set $mime_type «application/octet-stream»;

    if ($uri ~* «.avi$») {
    set $mime_type «video/x-msvideo»;
    }
    if ($uri ~* «.(flv|mng)$») {
    set $mime_type «video/x-$1»;
    }

    more_set_headers «Content-Type: $mime_type»;

  6. WebDev:

    в регулярке локейшна символы после последней точки можно взять в группу, типа:

    location ~* ^/some/path/.*.(.+)$ {

    if ($1 = «avi») {
    set $mime_type «video/x–msvideo»;
    }

  7. AmtEkb:

    Stephan-V: это будет быстрее, насколько я понимаю?

  8. KapCap:

    Stephan-V: в этом случае лучше map использовать, чтобы не плодить кучу evil-if-ов

  9. AmtEkb:

    Спасибо вам за советы, но начальство решило, что этот способ не обеспечивает обратной совместимости. То есть в итоге будем делать по-другому.
    Будем вводить расширения у файлов в хранилище, а старые файлы конвертить в новый формат именования.
    Мнда.

  10. WebDev:

    правильно решило

  11. LspMsk:

    http://nginx.org/ru/docs/http/ngx_http_c

    > Достаточно полная таблица соответствий входит в дистрибутив nginx и находится в файле conf/mime.types.

  12. AmtEkb:

    в смысле? Что ты хочешь этим сказать?

  13. LspMsk:

    попутал, точнее не заметил что у тебя файлы без расширения.

Добавить комментарий