AddType, AddHandler, SetHandlerの違い

Apache HTTP Server (v2.4) でのPHPの動作に必要な設定としてhttpd.confや.htaccessでのSetHandlerによる拡張子の割り当てがある。

しかし,ネット上では,AddTypeやSetHandler,AddHandlerなどを使った設定も見かける。これらの違いがよくわからなかったので,整理する。

結論からいうと,AddTypeとAddHandlerを複数拡張子のファイルにマッチする脆弱性があるため使う必要はなく,常にSetHandlerを使えばよい。

AddType

AddTypeは指定した拡張子を指定したコンテントタイプ (メディアタイプ,MIME) に割り当てる。同じ拡張子のマッピングの場合は上書きする。

AddType image/gif .gif

一度に複数の拡張子をMIMEタイプに割り当てることもできる。

AddType image/jpeg jpeg jpg jpe 

拡張子は,大文字小文字を無視し,先頭のドット (.) は任意だ。ただし,ファイルが複数の拡張子が存在する場合,どれかにマッチする。

AddHandler

AddHandlerは指定した拡張子を指定したハンドラーに割り当てる。同じ拡張子の割り当ての場合,上書きする。

AddHandler cgi-script .cgi

例えば,上記の設定は.cgi拡張子のファイルをCGIプログラムとみなす。

拡張子は,大文字小文字を無視し,先頭のドット (.) は任意だ。ファイルが複数の拡張子が存在する場合,どれかにマッチする。

SetHandler

SetHandlerは,.htaccessファイルやDirectory指令,Location指令などと併用して使用し,マッチした全ファイルを指定したハンドラーに割り当てる。

SetHandlerを使えば,拡張子を無視して全ファイルを特定種類のファイルとみなすことができる。

ApacheのSetHandlerPHPのマニュアルで記載されている通り,ApacheでPHPを有効化するのに以下のような設定が推奨されている。

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

PHPをApacheあり (--with-apxs2) でビルドすると有効にすると,上記内容を勝手にhttpd.confに追記してくれることもあるようだが,してくれないこともあるので,指定がなければ自分で指定する。

既存のSetHandlerによる設定を解除したければ,以下のようにnoneを指定する。構文上は,noneとなっているが,Noneでも問題なかった。

<FilesMatch "\.php$">
    SetHandler none
</FilesMatch>

その他,httpd 2.4.19以降からは正規表現でマッチさせた部分を参照することもできるようだ。

<LocationMatch ^/app/(?<sub>[^/]+)/>
     SetHandler "proxy:unix:/var/run/app_%{env:MATCH_sub}.sock|fcgi://localhost:8080"
</LocationMatch>

SetHandlerはデフォルトのハンドラーを上書きするので注意する。既存のAddHandlerの設定は消えるし,終端がスラッシュ (/) のURLが要求された場合のディレクトリーやインデックスファイルを応答する処理もなくなる。

違い

AddType, AddHandler, SetHandlerのいずれも以下のように記述することで,特定の拡張子のファイルを特定のハンドラーに割り当てることができる。

AddType application/x-httpd-php php
AddHandler application/x-httpd-php php <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>

ただし,AddTypeとAddHandlerはファイルが複数の拡張子を持つことを許容する。つまり,exploit.php.jpgというファイル名の場合,真ん中のphpも拡張子としてみなされてマッチする。

拡張子だけで判断することと,複数の拡張子を許容することから,潜在的危険性があるため,PHPでは推奨していない

Tell Apache to parse certain extensions as PHP. For example, let’s have Apache parse .php files as PHP. Instead of only
using the Apache AddType directive, we want to avoid potentially dangerous uploads and created files such as exploit.php.jpg from being
executed as PHP. Using this example, you could have any extension(s) parse as PHP by simply adding them. We’ll add .php to demonstrate.

PHP: Apache 2.x on Unix systems – Manual

AddTypeとAddHandlerのほうが指定が短く楽だが,それ以外に利点があまりない。

SetHandlerはcoreモジュールであるためデフォルトで使える。その一方,AddTypeとAddHandlerはmod_mimeモジュールであり,LoadModuleによる読み込みが必要だ。

これらのことから,MIMEやハンドラーの割り当てには,AddTypeとAddHandlerの代わりに,常にSetHandlerを使えばよいだろう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です