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

Mime Magic для файлов без расширения на Apache / 2.2.31 и mod_wsgi 3.4

Заранее извиняюсь за длину, благодарим за терпение. У меня есть старый производственный сервер, и никто не знает, как он был построен. Он использует apache + mod_wsgi для запуска приложения Cherry Py python для обслуживания изображений. Я воссоздаю его, чтобы задокументировать и начать обновление. Я столкнулся с проблемой, когда изображения без расширения файла, которые могут быть PNG или JPEG, поступают с:

Content-Type: "text/html;charset=utf-8"

рабочий сервер в настоящее время правильно возвращает:

Content-Type: "image/jpeg"

Информация о среде, в которой я воссоздаю сервер:

Amazon Linux AMI release 2017.03 (basically CentOS 6 it feels like)
Apache/2.2.31
mod_wsgi-3.4
CherryPy 3.2.0

В производственной среде установлены те же пакеты, за исключением того, что они работают на текущем Centos6 и Apache версии 2.2.17.

Файлы и соответствующие фрагменты:

httpd.conf

#/etc/httpd/conf/httpd.conf

LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so

TypesConfig /etc/mime.types

<IfModule mod_mime_magic.c>
#   MIMEMagicFile /usr/share/magic.mime                                           
   MIMEMagicFile conf/magic
</IfModule>

Include conf.sites/*.conf

# There really are no other directives or AddType calls that are relevant 
# that I can see, just standard  language and icon declarations
# if I should be more verbose here just let me know.

магия

# /etc/httpd/conf/magic
# JPEG images
0       beshort         0xffd8          image/jpeg

mime.types

# /etc/mime.types
image/jpeg                                      jpeg jpg jpe jfif

site.conf

# /etc/httpd/conf.sites/site.conf
<VirtualHost *:80>
    ServerName pic.project.com
    DocumentRoot "/srv/pic_project/html"
    RewriteEngine On                                            
    RewriteCond %{HTTP_USER_AGENT} Apache\sHttpClient [NC]
    RewriteRule . - [F,L]

    <Directory /srv/pic_project/html>
            Order allow,deny
            Allow from all
    </Directory>

    WSGIScriptAlias / /srv/pic_project/src/project.py

    <Directory /srv/pic_project/src>
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog logs/pic-error_log
    CustomLog logs/pic-access_log combined
</VirtualHost>

Файл, который Cherry Py использует для показа фотографии:

# /srv/pic_project/src/project.py

cherrypy.response.headers['Content-Type'] = cfile.mimetype
cherrypy.response.headers['Cherry-Py-Content-Type'] = cfile.mimetype
cherrypy.response.headers['Content-Disposition'] = 'inline; filename="12345.jpg"'

# I set two headers for debugging. Cherry-Py-Content-Type is always right
# "image/jpeg" or "image/png". "Content-Type" is always "text/html" once
# going through apache / mod_wsgi. Don't worry about "cfile", just know
# the mimetype attribute is always correct.

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

http://pic.project.com/pics/pic_type/owner_id/12345/

Дополнительные замечания:

Что я уже сделал:

Из того, что я читал в подобных вопросах, например:

В одном из комментариев говорится, что для того, чтобы mime_magic работал, mod_mime не должен находить совпадений, но, поскольку расширения нет, он находит кучу совпадений, и поэтому mime_magic даже не входит в игру. Это точно? Если да, могу ли я заставить его всегда использовать магию и никогда не использовать расширения? Иначе, какие еще методы для правильной установки Content-Type для файлов без расширения на основе содержимого?

Другой скажет, что вы можете использовать ForceType директива для соответствия шаблону файла в определенном каталоге. Проблема в том, что имена файлов - это просто числа, не разделенные по типу, поэтому / thing / 12345 и / thing / 12346 может быть PNG, а другой - JPEG, поэтому я не могу принудительно использовать шаблон, мне нужно определить тип на основе файла содержание.

Другой объявлял неправильный Content-Type в приложении, но я подтвердил, что это не так.

Я прочитал десятки других ответов и попробовал несколько обходных путей, но я думаю, что мне просто не хватает чего-то простого ..

Если вы зашли так далеко, спасибо за ваше время! Ценю любые предложения. По запросу добавлю недостающую / полезную отладочную информацию!

Ответом на мою конкретную проблему было то, что кто-то вручную отредактировал сгенерированный файл конфигурации на производственной машине. Поскольку сгенерированные конфигурации не передаются в систему контроля версий, а вместо этого шаблоны для сред копируются в используемую конфигурацию на основе среды, шаблон также не обновлялся. По сути, если бы мы запускали сборку на производственной машине, у нее также была бы эта проблема. Вариант конфигурации Cherry Py, которого мне не хватало, был:

tools.encode.add_charset = False

Без этого Cherry Py перезаписывал заголовок Content-Type, установленный в приложении. Оказывается, Apache / mod_mime / magic / modwsgi не имеет ничего общего. Была проблема с конфигурацией Cherry Py.