長さについては事前に申し訳ありませんが、今しばらくお待ちいただきますようお願いいたします。私はそれがどのように構築されたか誰も知らない古代の本番サーバーを持っています。 Apache + mod_wsgiを使用してCherryPy 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>
チェリーパイが写真を提供するために使用するファイル:
# /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
何も見つかりません。私が次のような同様の質問で読んだものから:
コメントの1つは、mime_magicが機能するためには、mod_mimeが一致するものを見つけてはならないというものですが、拡張機能がないため、たくさんの一致が見つかるため、mime_magicがゲームに参加することはありません。それは正確ですか?もしそうなら、私はそれを常に魔法を使用し、拡張機能を使用しないように強制できますか?それ以外の場合、コンテンツに基づく拡張子のないファイルのContent-Typeを適切に設定するための他の方法は何ですか?
別の人は、ForceType
ディレクティブを使用して、特定のディレクトリ内のファイルパターンに一致させることができると言います。問題は、ファイル名が単なる数字であり、タイプで区切られていないことです。したがって、/ thing/12345と/ thing/12346は一方がPNGで、もう一方がJPEGである可能性があるため、パターンを強制できません。ファイルに基づいてタイプを判別する必要があります。コンテンツ。
もう1つは、アプリで間違ったContent-Typeを宣言していましたが、そうではないことを確認しました。
私は他の何十もの答えを読み、複数の回避策を試しましたが、単純なものが欠けているだけだと思います。
ここまで来たら、ありがとうございました!提案に感謝します。リクエストに応じて、不足している/役立つデバッグ情報を追加します!
私の特定の問題に対する答えは、誰かが本番マシンで生成された構成ファイルを手動で編集したことでした。生成された構成はバージョン管理にコミットされず、代わりに環境のテンプレートがコピーされて環境に基づいて使用される構成になるため、テンプレートも更新されませんでした。基本的に、本番マシンでビルドを実行した場合、この問題も発生します。私が欠けていたCherryPy設定オプションは次のとおりです。
tools.encode.add_charset = False
これがないと、cherrypyはアプリケーションで設定されたContent-Typeヘッダーを上書きしていました。 Apache/mod_mime/magic/modwsgiとは何の関係もありません。すべてCherryPyの設定の問題でした。