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のSetHandlerとPHPのマニュアルで記載されている通り,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では推奨していない。
AddTypeとAddHandlerのほうが指定が短く楽だが,それ以外に利点があまりない。
SetHandlerはcoreモジュールであるためデフォルトで使える。その一方,AddTypeとAddHandlerはmod_mimeモジュールであり,LoadModuleによる読み込みが必要だ。
これらのことから,MIMEやハンドラーの割り当てには,AddTypeとAddHandlerの代わりに,常にSetHandlerを使えばよいだろう。
“AddType, AddHandler, SetHandlerの違い” に対して2件のコメントがあります。