treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

Apache設定AddHandlerが理解不足で画像を読み込まない話

昨日の続きです。まさか2日連続になるとは思っていませんでした。

treedown.hatenablog.jp

その後、別担当に引き渡してインストールが完了したらしいのですが、
「インストール完了、しかし画像&CSSのファイルが読み込まれてないらしいです。何か分かりますか?」
と質問が来た。うーむ、さっそく確認してみますね。

インストール後に気づいた予想外のこと

「どうせインストーラが動作する一回だけの利用」と思っていたら、install.cgiを配置した/opt/acmailer3ディレクトリにガッツリインストールするらしく、ファイルが増えていました。

と、なると、CGI実行のための動作設定はしたけど、画像を読み込むような設定はしていないから、そのせいなんですか?という仮説が立ちます。
実際にアクセスしてみると、

f:id:treedown:20151123225151p:plain


画像ファイルが表示されるはずの箇所が「×」ってなっていて、テキストに置き換わっている状況です。
エラーログも確認しておきます。
--------------------------------------------------------------------------------------------
[Mon Nov 23 22:02:42 2015] [error] [client 111.222.333.444 (13)Permission denied: exec of '/opt/acmailer3/img/ahref_2.jpg' failed, referer: http://www.hoge.co.jp/acmailer3/login.cgi?

[Mon Nov 23 22:02:42 2015] [error] [client 111.222.333.444] Premature end of script headers: ahref_2.jpg, referer: http://www.hoge.co.jp/acmailer3/login.cgi?
--------------------------------------------------------------------------------------------
「ahref_2.jpg」 が「Permission denied」と「Premature end of script headers」、「exec of '/opt/acmailer3/img/ahref_2.jpg」と表記されているので、.jpgファイルをcgiとして実行しようとしていますね。
これはAddHandlerが不足しているからじゃないか?ということです。前出の設定だけではディレクトリ内のファイルを全部cgi扱いしてでファイルが認識できない状況になります。

対処のための設定追記

一言で言うと「AddHandlerの設定が必要」です。Apacheでは、全種類のファイルにハンドラが割り当てられています。たとえばHTMLファイルには"default-handler"という暗黙ハンドラが割り当てられており、リクエストに対してhttpdサーバからリクエスト元クライアントに対してHTMLファイルの内容を送信するという処理が割り当てられています。
ScriptAliasの暗黙ハンドラは当然CGI実行ですから、他のHTMLファイルや画像ファイルが通常の動作と異なるのは納得です。
ファイルに対して処理を行う(割り当てる)のがハンドラの役割なので、暗黙のハンドラと別の動作が要求されるファイルに対しては、別途ハンドラの定義を実施する必要があるわけです。これを実現するのが「AddHandler」ということです。
もういちど、「/etc/apache2/sites-available/default」の対象箇所を追記・修正しましょう。
----------------------------------------------
        ScriptAlias /acmailer3/ /opt/acmailer3/
        <Directory "/opt/acmailer3">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
                AddHandler default-handler .html .htm .gif .png .jpg .swf .css .js .xml .rdf
        </Directory>
----------------------------------------------
AddHandler」行を追加します。
ハンドラ「default-handler」を指定して、スペース区切りで対象となるファイル拡張子を入力します。
ここでは、拡張子が「.html .htm .gif .png .jpg .swf .css .js .xml .rdf」のファイルはScriptAlias指定の.cgiファイル扱いにならないように、ファイル指定します。
ScriptAliasで指定したディレクトリ配下は全部.cgi…いえ正確にはどんな拡張子でもCGIファイルとして実行しようとするのです。なので「exec of '/opt/acmailer3/img/ahref_2.jpg」とエラーログに記録されています。
AddHandler行でCGI実行をしないための除外拡張子を用意しましたので、これで他のファイルは正常に動作してくれるはずです。

apacheをリスタートして、アクセスを確認してみました。

f:id:treedown:20151123230302p:plain


できました。

 

ここまでのまとめ

  • ScriptAliasでApacheCGI実行環境を設定する場合、複数の場所を指定するのは可能。
  • だが、ScriptAliasで指定するローカルパスはDocumentRoot以外の場所であることが必要。(HTTP 500 Internal Server Error エラーとなる。)

これに加えて、

  • 全部cgi扱いされないよう、利用するファイル拡張子AddHandlerで指定しておくこと。

これで、ちゃんと利用できるようになったと考えられまする。