Заранее извиняюсь за длину, благодарим за терпение. У меня есть старый производственный сервер, и никто не знает, как он был построен. Он использует 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/
Дополнительные замечания:
Что я уже сделал:
Header set Content-Type "image/jpeg"
, а затем постепенно перемещал ее в начало файла, чтобы увидеть, не будет ли она перезаписана, как это делает заголовок приложения, но пока эта строка находится где-нибудь в файле conf, она будет работать / не будет перезаписана. (помните, что это может быть PNG или JPEG, поэтому статическая установка не сработает).sudo find / -type f -name .htaccess
ничего не находит. Из того, что я читал в подобных вопросах, например:
В одном из комментариев говорится, что для того, чтобы 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.