Apache-2.2

在 Apache/2.2.31 和 mod_wsgi 3.4 上對沒有副檔名的文件進行 Mime Magic

  • April 20, 2017

提前抱歉,感謝您的耐心等待。我有一台古老的生產伺服器,沒人知道它是如何建構的。它使用 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

啞劇類型

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

站點配置文件

# /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/

補充筆記:

  • 生產伺服器+我的遊戲具有客戶端程式碼的精確副本,因此問題不太可能出在cherry py / python程式碼中。
  • httpd.conf、magic、mime.types、虛擬主機文件是生產伺服器上的精確副本,同樣不太可能是問題所在。
  • 轉到 URL 時,瀏覽器中顯示的文本開頭包含 JFIF,這意味著它確實找到了圖像。

到目前為止我所做的:

  • 在聲明 Content-Type 響應標頭後立即設置自定義響應標頭,以確認應用程序正在設置正確的值,它是。
  • 三重檢查文件位置/權限,然後讓另外兩個同事也檢查。
  • 在 /etc/httpd/conf/httpd.conf 的底部添加了一行以強制 Content-Type 標頭:Header set Content-Type "image/jpeg",然後逐漸將其移動到文件的頂部,以查看是否最終像應用程序標頭一樣被覆蓋,但是只要該行位於 conf 文件中的任何位置,它就可以工作/不會被覆蓋。(請記住,它可能是 PNG 或 JPEG,因此靜態設置它不起作用)。
  • 掃描生產+娛樂以查找任何可能影響的 .htaccess 文件,我找不到任何文件,執行:sudo find / -type f -name .htaccess什麼也沒找到。
  • 確認所有生產 apache 模組都安裝在娛樂上
  • 確認錯誤日誌中沒有消息,訪問日誌按預期顯示請求,系統日誌中沒有任何內容。

根據我在類似問題中所讀到的內容,例如:

其中一條評論說,為了讓 mime_magic 工作,mod_mime 必須找不到任何匹配項,但由於沒有擴展,它會找到一堆匹配項,因此 mime_magic 甚至永遠不會進入遊戲。那準確嗎?如果是這樣,我可以強迫它總是使用魔法而不是擴展嗎?否則,還有哪些其他方法可以根據內容為沒有副檔名的文件正確設置 Content-Type?

另一個人會說您可以使用ForceType指令來匹配特定目錄中的文件模式。問題是文件名只是數字,沒有按類型分隔,所以 /thing/12345 和 /thing/12346 一個可能是 PNG,另一個是 JPEG,所以我不能強制使用模式,我需要根據文件確定類型內容。

另一個在應用程序中聲明了錯誤的內容類型,但我已經確認不是這種情況。

我已經閱讀了許多其他答案並嘗試了多種解決方法,但我認為我只是缺少一些簡單的東西..

如果你能做到這一點,謝謝你的時間!感謝任何建議。將根據要求添加任何缺失/有用的調試資訊!

我的具體問題的答案是有人在生產機器上手動編輯了生成的配置文件。由於生成的配置不會送出給版本控制,而是將環境模板複製為基於環境的使用配置,因此模板也沒有更新。基本上,如果我們在生產機器上執行建構,它也會有這個問題。我缺少的 Cherry Py 配置選項是:

tools.encode.add_charset = False

沒有這個,cherry py 將覆蓋應用程序中設置的 Content-Type 標頭。結果與 Apache / mod_mime / magic / modwsgi 無關。都是 Cherry Py 配置問題。

引用自:https://serverfault.com/questions/845412