在没有扩展名的Apache / 2.2.31和mod_wsgi 3.4上的MIME Magic

对不起,提前的长度,感谢您的耐心。 我有一个古老的生产服务器,没有人知道它是如何build立的。 它使用apache + mod_wsgi来运行一个Cherry Py python应用程序来提供图像。 我正在重新创build它来logging它并开始升级。 我遇到了一个问题,没有文件扩展名,可以是PNG或JPEG的图像正在通过:

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

生产服务器当前正确返回:

 Content-Type: "image/jpeg" 

有关环境的信息我正在重新创build服务器:

 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> 

樱桃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/ 

补充笔记:

  • 生产服务器+我的娱乐有客户端代码的精确副本,所以它不太可能是樱桃py / python代码中的问题。
  • httpd.conf,magic,mime.types,虚拟主机文件是生产服务器上的内容的精确副本,也不太可能成为问题。
  • 去浏览器时显示在浏览器中的文本包含JFIF,一开始意味着它find了图像。

到目前为止我所做的是:

  • 在声明Content-Type响应头之后立即设置自定义响应头,以确认应用程序正在设置正确的值。
  • 三重检查文件位置/权限,然后有另外两个同事也检查。
  • 在/etc/httpd/conf/httpd.conf的底部添加一行以强制Content-Type标题: Header set Content-Type "image/jpeg" ,然后逐渐将其移至文件顶部以查看是否最终会像应用程序头一样被覆盖,但只要该行在conf文件中的任何位置,它就会工作/不被覆盖。 (记住它可能是PNG或JPEG,所以静态设置它不会工作)。
  • 扫描生产+娱乐find任何可能影响的.htaccess文件,没有任何我能find,运行: sudo find / -type f -name .htaccess找不到任何东西。
  • 确认所有生产apache模块安装在娱乐
  • 在错误日志中确认没有消息,访问日志按期望显示请求,系统日志中没有任何消息。

从我读过类似的问题,如:

  • 让Apache识别没有扩展名的MIMEtypes的文件
  • 不正确的MIMEtypes – 拉出我的头发
  • Apache在一些png文件上返回文本/ html

其中一条评论说为了让mime_magic工作,mod_mime一定不能find任何匹配,但是由于没有扩展,所以find了一堆匹配,所以mime_magic从来没有进入游戏。 这是准确的吗? 如果是这样,我可以强迫它总是使用魔法,永远不会扩展? 否则,还有什么其他的方法可以根据内容正确设置没有扩展名的文件的Content-Type?

另一个会说你可以使用ForceType指令来匹配特定目录中的文件模式。 问题是文件名只是数字,而不是按types分隔,所以/ thing / 12345和/ thing / 12346可能是PNG和另一个JPEG,所以我不能强制一个模式,我需要根据文件来确定types内容。

另一个是在应用程序中声明了一个错误的Content-Type,但是我确认事实并非如此。

我已经读了几十个其他的答案,并尝试了多个解决方法,但我想我只是缺less一些简单的..

如果你有这么多,谢谢你的时间! 欣赏任何build议。 将请求添加任何缺less/有用的debugging信息!

我的具体问题的答案是有人在生产机器上手动编辑生成的configuration文件。 由于生成的configuration不会提交到版本控制,而是将环境的模板复制为基于环境的使用configuration,所以模板也不会更新。 基本上,如果我们在生产机器上进行生产,那么也会出现这个问题。 我错过的Cherry Py config选项是:

 tools.encode.add_charset = False 

没有这个,樱桃py覆盖应用程序中的Content-Type头部集。 结果与Apache / mod_mime / magic / modwsgi无关。 是所有的樱桃Pyconfiguration问题。