web-dev-qa-db-ja.com

Apache /2.2.31およびmod_wsgi3.4の拡張子のないファイルのMimeMagic

長さについては事前に申し訳ありませんが、今しばらくお待ちいただきますようお願いいたします。私はそれがどのように構築されたか誰も知らない古代の本番サーバーを持っています。 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/

その他の注意事項:

  • 本番サーバーと私のレクリエーションにはクライアントコードの正確なコピーがあるため、問題がチェリーpy/pythonコードにある可能性はほとんどありません。
  • Httpd.conf、magic、mime.types、仮想ホストファイルは、本番サーバーにあるものの正確なコピーであり、これも問題になる可能性は低いです。
  • URLにアクセスしたときにブラウザに表示されるテキストには、最初にJFIFが含まれています。これは、画像が検出されることを意味します。

私がこれまでにしたこと:

  • Content-Type応答ヘッダーが宣言された直後にカスタム応答ヘッダーを設定して、アプリケーションが正しい値を設定していることを確認します。
  • トリプルチェックされたファイルの場所/アクセス許可、次に別の2人の同僚にもチェックしてもらいました。
  • /etc/httpd/conf/httpd.confの下部に、Content-Typeヘッダーを強制する行を追加しました:Header set Content-Type "image/jpeg"次に、ファイルの先頭に徐々に移動して、アプリケーションヘッダーのように最終的に上書きされるかどうかを確認しますが、その行がconfファイルのどこかにある限り、機能するか、上書きされません。 (PNGまたはJPEGである可能性があるため、静的に設定しても機能しないことに注意してください)。
  • 影響を与える可能性のある.htaccessファイルを見つけるために本番環境とレクリエーションをスキャンしました。私が見つけることができるものはありません。実行中:Sudo find / -type f -name .htaccess何も見つかりません。
  • すべての本番Apacheモジュールがレクリエーションにインストールされていることを確認しました
  • エラーログにメッセージがないことを確認しました。アクセスログには期待どおりのリクエストが表示され、システムログには何も表示されません。

私が次のような同様の質問で読んだものから:

コメントの1つは、mime_magicが機能するためには、mod_mimeが一致するものを見つけてはならないというものですが、拡張機能がないため、たくさんの一致が見つかるため、mime_magicがゲームに参加することはありません。それは正確ですか?もしそうなら、私はそれを常に魔法を使用し、拡張機能を使用しないように強制できますか?それ以外の場合、コンテンツに基づく拡張子のないファイルのContent-Typeを適切に設定するための他の方法は何ですか?

別の人は、ForceTypeディレクティブを使用して、特定のディレクトリ内のファイルパターンに一致させることができると言います。問題は、ファイル名が単なる数字であり、タイプで区切られていないことです。したがって、/ thing/12345と/ thing/12346は一方がPNGで、もう一方がJPEGである可能性があるため、パターンを強制できません。ファイルに基づいてタイプを判別する必要があります。コンテンツ。

もう1つは、アプリで間違ったContent-Typeを宣言していましたが、そうではないことを確認しました。

私は他の何十もの答えを読み、複数の回避策を試しましたが、単純なものが欠けているだけだと思います。

ここまで来たら、ありがとうございました!提案に感謝します。リクエストに応じて、不足している/役立つデバッグ情報を追加します!

1
Chris Robak

私の特定の問題に対する答えは、誰かが本番マシンで生成された構成ファイルを手動で編集したことでした。生成された構成はバージョン管理にコミットされず、代わりに環境のテンプレートがコピーされて環境に基づいて使用される構成になるため、テンプレートも更新されませんでした。基本的に、本番マシンでビルドを実行した場合、この問題も発生します。私が欠けていたCherryPy設定オプションは次のとおりです。

tools.encode.add_charset = False

これがないと、cherrypyはアプリケーションで設定されたContent-Typeヘッダーを上書きしていました。 Apache/mod_mime/magic/modwsgiとは何の関係もありません。すべてCherryPyの設定の問題でした。

0
Chris Robak