MIME・文字コード設定

Updated / Published

meta要素http-equiv属性ではContent-Type, Content-Style-Type, Contet-Script-Typeの各値を記述することで、それぞれウェブページ、スタイル言語、スクリプト言語の MIME、及び文字コードをcontent属性で指定することができます。これらの設定はブラウザや検索エンジンロボットなどの UA が文字コードやMIMEの情報を適切に処理できるように働きかけます。しかし、meta要素による指定はあくまでもUA とウェブサーバがデータを送受信する際に使われている通信手順であるHTTPではなく、補足情報(メタ情報)でしかありません。また、XHTML1.1のようなXML互換のXHTML文書では meta要素の http-equiv属性の指定は HTML互換のため、指定すること自体が推奨されていません。

ここでは meta要素のhttp-equiv属性を用いることなく、UAが情報を正しく解釈できるように HTTPレスポンスヘッダ(UAのリクエスト時のメッセージをHTTPリクエストヘッダ、このリクエストに対してウェブサーバが返すメッセージをHTTPレスポンスヘッダと言う)内に直接、ウェブページ、スタイル言語、スクリプト言語などのMIMEと文字コードを明示する方法、あわせてAddTypeディレクティブの設定を応用して、どの拡張子をどの MIMEタイプで通知するかを設定することで、特定の拡張子に関係なく SSIPHP などを利用できるようにする方法を解説します。

指定の拡張子に対する MIMEの追加定義

AddType image/png png
AddType image/gif gif
AddType image/jpeg jpg jpeg

AddTypeディレクティブに続いて、MIMEを指定し、半角スペースをあけて拡張子(extension)を記述することで、その拡張子(extension)に対する MIMEを定義することができます。ここでは1行目は "png" を拡張子にもつファイルを "image/png" の MIMEで通知し、2行目の指定は "gif" を拡張子にもつファイルを "image/gif" の MIMEで通知し、3行目の指定は "jpg"、または "jpeg" を拡張子にもつファイルを "image/jpeg" の MIMEで通知するよう HTTPレスポンスヘッダに設定することで、UA がウェブサーバへこれらの拡張子もつファイルをリクエストした際に指定されたMIMEで処理するように働きかけます。MIMEの指定に続く拡張子の指定は半角スペースを空けることで、複数記述することができます。また拡張子には、わざわざドット(.)を前置する必要はありません(あってもなくても良い)。

MIME(Multipurpose Internet Mail Extension)は、従来の電子メールにあった最大文字数やASCIIコードしか送信することができないといった制限を取り除くために、1992年にIETFによって電子メールでさまざまなフォーマット(書式)を扱えるようにする規格として提唱されました。それがメールだけでなく、ウェブサーバにおいても、各ファイルの拡張子(識別子)に応じてどのデータ型(データの種類)であるかを示しているのもMIMEです。

MIMEも他の通信プロトコルと同様、ヘッダとデータ本体と言うフィールド構造になっており、データ型(データの種類)を記述するために Content-Type というフィールドが用意されています。Content-Typeフィールドの記述は「タイプ名/サブタイプ名」の形式で構成します。たとえばHTMLファイルとして読み取ることになるデータ型は、"text/html" と記述します。"text" の部分がMIMEタイプと呼ばれ、"html" の部分がMIMEサブタイプと呼ばれます。タイプ名とサブタイプ名の間は、常にスラッシュ(/)で区切られています。一つのタイプ名には多数のサブタイプ名が定義されています。しかし、"html" のようなサブタイプ名の部分は限定的です。

MIMEの追加定義にあわせて文字コードも指定

AddType "text/xml; charset=utf-8" xml rdf
AddType "text/html; charset=utf-8" html htm
AddType "text/plain; charset=Shift_JIS" txt

MIMEの追加定義にあわせて、文字コードが関係するファイルについては文字コードを明示することができます。ウェブページ側の meta要素の http-equiv属性で文字コードの補足情報(メタ情報)を示すことのできないXML互換のXHTML文書においては特に有効な指定になります。

1行目の指定は "xml"、または "rdf" を拡張子にもつファイルをダブルクォーテーション(")で1つの値として括られている「"text/xml; charset=utf-8"」の部分で "text/xml" の MIMEに "utf-8" の文字コードで通知する設定を示します。

2行目は "html"、または "htm" を拡張子にもつファイルを "text/html" の MIMEに "utf-8" の文字コードで通知する設定です。

3行目は "txt" を拡張子にもつファイルを "text/plain" の MIMEに "Shift_JIS" の文字コードで通知する設定です。

SSI, PHPを拡張子に関わらず利用できようにMIMEの追加定義

ウェブサイトの作成を解説しているウェブページで「HTMLファイルの拡張子は htm、または htmlなければならない」や「CSSファイルの拡張子は cssなければならない」といった説明を良く見かけますが、正確にはこれらは間違いです。これはあくまでもウェブサーバ側の管理者が httpd.conf にデフォルトで MIMEをその拡張子に対して通知するように設定しているためです。たとえば、次のように記述することで拡張子が "html" であっても SSIPHP といった技術を利用することができます。

拡張子に shtml または html をもつファイルで SSI を利用可能にする設定例

AddType text/x-server-parsed-html shtml html

拡張子に php または html をもつファイルで PHP を利用可能にする設定例

AddType application/x-httpd-php php html

このように、その拡張子をもつファイルをどの MIMEで通知するかによって、たとえ "html" の拡張子であっても PHP を利用するために "php" の拡張子に書き換えなければならないというわけではありません。このように MIMEの設定を有効的に活用できれば、ウェブサイトの構築・管理においてとても便利なものとなり得ます。

まとめと AddTypeディレクティブの構文

AddType MIMEタイプ/MIMEサブタイプ 拡張子
AddType "MIMEタイプ/MIMEサブタイプ; charset=文字コード" 拡張子

AddTypeディレクティブに続いて、最初の値には MIMEタイプとMIMEサブタイプをスラッシュ区切り(MIMEタイプ/MIMEサブタイプ)で記述します。そして、半角スペースを空けて、その MIMEで通知するファイルの拡張子(extension)を指定します。拡張子の部分にあたる値の半角アルファベットは大文字・小文字の区別がなく(case-insensitive)、ドット(.)についてもあってもなくても構いません。さらに、文字コードが関係するファイルについては、あわせて通知する文字コードを設定できます。文字コードを設定する場合は、最初の値の部分をダブルクォーテーション(")で括り、まず MIMEタイプとMIMEサブタイプをスラッシュ区切り(MIMEタイプ/MIMEサブタイプ)で記述してから、セミコロン(;)で区切って「charset=文字コード」の形式で文字コードを指定します。最後は、同様に半角スペースを空けて、その MIMEで通知するファイルの拡張子(extension)を指定します。

DefaultTypeディレクティブと ForceTypeディレクティブ

AddTypeディレクティブと同じように、ウェブサーバからのHTTPレスポンスヘッダで、指定のファイルのMIMEを通知できる設定のディレクティブに DefaultTypeディレクティブと ForceTypeディレクティブがあります。

  • DefaultTypeディレクティブは拡張子がファイル名に含まれていない未知のファイルがあった場合、その未知のファイルを指定のMIMEで通知できる設定です。
  • ForceTypeディレクティブはそのディレクトリ以下にあるすべてのファイルを指定のMIMEで通知できる設定です。

どちらのディレクティブも活用方法は次のようになります。

/公開領域/.htaccess

DefaultType "text/html; charset=utf-8"

公開領域配下で、拡張子がファイル名に含まれていない未知のファイルがあった場合、"text/html" の MIMEに "utf-8" の文字コードで通知できます。

/公開領域/style/.htaccess

DefaultType "text/css; charset=Shift_JIS"

styleディレクトリ配下に拡張子がファイル名に含まれていない未知のファイルがあった場合、"text/css" の MIMEに "Shift_JIS" の文字コードで通知する設定です。styleディレクトリ配下で拡張子にcssを持たないファイルがあっても、CSSのスタイルシートファイルとして通知できます。

/公開領域/gif/.htaccess

ForceType image/gif

gifディレクトリ配下にあるすべてのファイルを "image/gif" の MIMEで通知する設定です。たとえ、他の拡張子をもつファイルであっても、gifディレクトリ配下に存在する場合はgif画像として通知できます。

DefaultTypeディレクティブは拡張子がファイル名に含まれていない未知のファイルのみに働きかけますが、ForceTypeディレクティブはそのディレクトリおよびサブディレクトリにあるファイルの MIMEを統一して通知するように働きかけます。たとえば、styleディレクトリ配下のディレクトリには、いろいろなファイルがある中で、CSS を記述している拡張子をもたないファイルが多い場合に適しています。また、gifディレクトリ配下には GIF 形式の画像のファイル専用のディレクトリを想定しており、すべてのファイルで拡張子 "gif" をつけていない場合に上記のように設定するのが適しています。

DefaultTypeディレクティブと ForceTypeディレクティブの使い分けは、この通りですが、ForceTypeディレクティブは DefaultTypeディレクティブと違って、未知のファイルだけでなく、設定されたMIMEで通知することが決められている拡張子をもつファイルも含めすべての MIMEの関連付けを上書きすることに注意してください。