§1 mod_mime

§1.1 Content-Typeで返すcharsetを変える

デフォルトのcharsetを変える場合はAddDefaultCharsetで指定する。 AddDefaultCharsetはtext/plainあるいはtext/htmlに適用される。 拡張子別に指定する場合は、AddCharsetを用いる。

AddDefaultCharset utf-8
AddCharset utf-8 .xhtml
AddCharset utf-8 .xml
AddCharset utf-8 .rdf

このように設定するとMIME Typeがtext/plain, text/htmlのファイルおよび.xhtml, .xml, .rdfの拡張子を持つファイルの場合はcharsetにutf-8が設定される。 AddDefaultCharset Offにすると設定を無効にできる。

§1.2 gzip圧縮されたファイルを展開した状態で表示させる

AddEncodingを設定することでレスポンスの内容エンコーディング(Content-Encoding)を指定できる。 例えば.diff.gzの拡張子を持つファイルについて、AddEncodingで内容エンコーディングにgzipやcompressを指定して返せば、UA側では解凍した状態で表示するようになる。

<FilesMatch "\.diff\.gz$">
    AddEncoding x-gzip .gz
    ForceType "text/plain"
</FilesMatch>

設定の各行の詳細な意味は次のとおり。

<FilesMatch "\.diff\.gz$">
拡張子に.diff.gzを持つファイルについて以下の設定を適用する
AddEncoding x-gzip .gz
拡張子に.gzを持つファイルは内容エンコーディングにx-gzipを指定して返す(x-gzipはgzipと等価、またx-compress(=compress)も指定できる)
ForceType
MIME Typeをtext/plainに上書きする(これを設定しない場合、Content-Typeには.gzに割り当てられているデフォルトのMIME Type(application/x-gzip等)を載せてしまう)

このようにすると、UA側では受け取ったレスポンスをgzipで解凍し、text/plainとして表示する。 ただし、Firefox 2.0ではプレインテキストとして表示するが、IE 7.0ではファイルのダウンロードの動作となってしまう(Content-Typeではなく拡張子の.diff.gzを見て表示出来ない形式として判断しているため?)。

§2 mod_rewrite

§2.1 application/xhtml+xmlに対応していないUAに対してはtext/htmlで返す

XHTMLなどをapplication/xhtml+xmlとして配信する場合に、Microsoft Internet Explorer(6.0, 7.0)などのapplication/xhtml+xmlに対応していない(または望ましくない挙動をする)UAからのリクエストに対しては、Content-Typeをtext/htmlにする方法。

AddType "application/xhtml+xml" .xhtml
RewriteEngine on
RewriteCond %{LA-F:REQUEST_FILENAME} \.xhtml$
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE.6\.0
RewriteRule .* - "[T=text/html; charset=utf-8]"

設定の各行の詳細な意味は次のとおり。

AddType "application/xhtml+xml" .xhtml
拡張子.xhtmlを持つファイルにapplication/xhtml+xmlのMIME Typeを持たせる
RewriteEngine on
RewriteEngineをonにする
RewriteCond %{LA-F:REQUEST_FILENAME} \.xhtml$
リクエストURIで返されるファイルの拡張子が.xhtmlで、かつ続く条件にマッチする場合にRewriteRuleを適用する
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml [OR]
Acceptヘッダにapplication/xhtml+xmlを含まない場合か、または続く条件にマッチする場合にRewriteRuleを適用する
RewriteCond %{HTTP_USER_AGENT} MSIE.6\.0
User-AgentにMSIE 6.0を含む場合にRewriteRuleを適用する
RewriteRule .* - "[T=text/html; charset=utf-8]"
Content-Typeヘッダを'text/html; charset=utf-8'に書き換えてレスポンスを返す

このように設定することで、Acceptヘッダにapplication/xhtml+xmlを含まないUAかIE 6.0が拡張子.xhtmlファイルをリクエストした場合にtext/htmlで返すようになる。 IE 6.0はAcceptヘッダにapplication/xhtml+xmlを載せたリクエストを送って来るが、application/xhtml+xmlで返しても正しく表示されないのでtext/htmlとして返すようにしている。 参考:XHTML1.1と application/xhtml+xml - Blog - Gertrud

§2.2 /?foo=barの形式でのリクエストを別のスクリプトにリダイレクトする

URLにCGI等のスクリプトファイル名を指定しないでクエリだけが指定されている場合に、そのリクエストを別のスクリプトにリダイレクトする例。

RewriteCond %{QUERY_STRING} .+
RewriteRule ^$ /moved.cgi [L,R=301,QSA]

設定の各行の詳細な意味は次のとおり。

RewriteCond %{QUERY_STRING} .+
クエリ文字列が1文字以上の場合にRewriteRuleを適用する
RewriteRule ^$ /moved.cgi [L,R=301,QSA]
リクエストURIからクエリ文字列を除いた部分が空白(つまり/のみ)の場合、moved.cgiにリクエストをリダイレクトする。 また、これ以上の書き換えを行わない(L)、ステータスコードとして301 Moved Permanentlyを返す(R=301)、書き換えたURLに元のクエリ文字列を追加する(QSA)

このように設定すると、リクエストURI"/?foo=bar"は"/moved.cgi?foo=bar"にリダイレクトされる。 この例ではクエリ文字列に何も含まない場合はリダイレクトされない(リクエストURI"/"は"/moved.cgi"にリダイレクトされない)が、何も含まれていない場合でもリダイレクトしたい場合は、

RewriteCond %{QUERY_STRING} .*

とする。

§3 mod_autoindex

mod_autoindexのカスタマイズに関するメモ。 参考資料: mod_autoindex - Apache HTTP サーバ

§3.1 表示されるアイコンを変える

まず、アイコンが表示されるためには、IndexOptionsディレクティブにFancyIndexingが設定されていなければならない。

IndexOptions FancyIndexing ...

次に、ファイルの種類を表すアイコンを変えるには、AddIconディレクティブを使用する。 これは、表示するアイコンを拡張子毎に設定するためのもので、MIMEタイプ毎にアイコンを設定するAddIconByTypeというディレクティブも存在する。 以下は設定例(ここではiconsディレクトリ以下にアイコンファイルが格納されているものとする)。

# image
AddIcon /icons/image.png .png .gif .jpg .bmp .psd

# audio
AddIcon /icons/sound.png .mp3 .wav .wma

# movie
AddIcon /icons/video.png .wmv .avi .mpg

# text, document
AddIcon /icons/html.png .html .shtml .htm
AddIcon /icons/text.png .txt .log
AddIcon /icons/document.png .xsl .ppt .doc

# archive, compressed
AddIcon /icons/tar.png .tar
AddIcon /icons/compressed.png .Z .z .tgz .gz .zip .lzh .rar

# executive, object
AddIcon /icons/binary.png .bin
AddIcon /icons/winexec.png .exe .dll
AddIcon /icons/shellscript.png .sh .shar .csh .ksh .tcl .bat

# special
AddIcon /icons/up.png ..
AddIcon /icons/folder.png ^^DIRECTORY^^
AddIcon /icons/blank.png ^^BLANKICON^^

# default
DefaultIcon /icons/unknown.png

^^DIRECTORY^^はディレクトリを表すアイコン、^^BLANKICON^^はヘッダ部分のアイコンを設定するものを表す。 DefaultIconディレクティブを使用すると、AddIconで設定したいずれの条件にも該当しなかった場合のアイコンを設定することが出来る。

§3.2 Descriptionのカラムに表示されるテキストを設定する

AddDescriptionディレクティブにて、Descriptionのカラムに表示されるテキストを設定することが出来る。 拡張子だけではなく、直接ファイル名を指定したりワイルドカードを使用することも出来る(例えばReadMe.*など)

AddDescription "Parent directiory" ..
AddDescription "Image" .png .gif .jpg .bmp .psd
AddDescription "Audio" .mp3 .wav .wma
AddDescription "Video" .wmv .avi .mpg
AddDescription "Compressed" .Z .z .tgz .gz .zip .lzh .rar
AddDescription "?" *

ちなみに、DefaultDescriptionのようなディレクティブが存在しないようなので、この例では「AddDescription "?" *」でいずれの条件にも該当しない場合に表示されるテキストを設定している。

また、アイコン部分にもファイルへのリンクを設定したい場合は、IndexOptionsディレクティブにてIconsAreLinksオプションを指定する。

IndexOptions FancyIndexing IconsAreLinks ...

§3.3 デフォルトの並び順を設定する

IndexOrderDefaultディレクティブを指定すると、デフォルトの並び順を指定することが出来る。

IndexOrderDefault Descending Size

指定方法は「IndexOrderDefault [昇順/降順] [並べ替え順]」。 Ascending(昇順)またはDescending(降順)を指定する。 並べ替え順には、Name(ファイル名)、Date(更新日)、Size(サイズ)、Description(説明)のいずれかを指定する。 上記の例だと、ファイルのサイズが大きい順位並べ替えられて表示される。

また、ファイル名にバージョンが付与されている場合について、バージョン順で並べ替えを行わせるには、IndexOptionsディレクティブにてVersionSortオプションを指定する。

IndexOptions ... VersionSort ...

§3.4 ディレクトリを一番始めに表示させる

ファイル・ディレクトリをまとめて並べ替えるのではなく、どのような順序で並べ替えてもディレクトリは一番始めに表示されるようにするためには、IndexOptionsディレクティブにてFoldersFirstオプションを設定する。

IndexOptions ... FoldersFirst ...

§3.5 ファイルの一覧をtableとして出力させる

IndexOptionsディレクティブにHTMLTableオプションを追加することで、ファイル一覧をtableとして出力させることが出来る。

IndexOptions ... HTMLTable

§3.6 ヘッダ・フッタをオリジナルのものにする

特に設定をしなければデフォルトのヘッダとフッタが表示されるが、ここにオリジナルのものを読み込ませるにはHeaderNameおよびReadmeNameディレクティブを使用する。 HeaderNameで指定したファイルがファイル一覧の上、ReadmeNameで指定したファイルがファイル一覧の下にそれぞれ読み込まれて表示される。 そのため、それぞれヘッダ、フッタとして使用するファイルを指定することが出来る。

HeaderName /header.html
ReadmeName /footer.html

デフォルトで表示される分割線を表示させたくない場合は、IndexOptionsディレクティブにSuppressRulesオプションを追加する。 また、<html>や<body>などのタグを自分で設定したい場合は、IndexOptionsディレクティブにSuppressHTMLPreambleオプションを追加することで、<html>や<body>を出力させないようにすることが出来る。

IndexOptions ... SuppressHTMLPreamble SuppressRules

ファイル名に日本語文字が含まれていて文字が化けてしまう場合などは、SuppressHTMLPreambleオプションを追加し、HeaderNameで読み込まれるように設定したファイルにてHTML文書の文字コードをシステムの文字コードにあわせるようにすればよい。

以下は、上記header.htmlとfooter.htmlの一例。

header.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">

<head>
  <base target="_self" />
  <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
  <title><!--#echo var="REQUEST_URI" --></title>
</head>

<html>
  </body>
    <div style="padding: 1em;">
      <h1><!--#echo var="REQUEST_URI" --></h1>

footer.html

    </div>
  </body>
</html>

SuppressHTMLPreambleを指定すると現在のディレクトリ名が表示されなくなってしまうので、SSIを使用して表示させている(<!--#echo var="REQUEST_URI" -->の部分)。 当然、SSIを有効にしていなければ表示されない。

§4 mod_layout

mod_layoutに関するメモ。 mod_layoutを使うと、SSIのようにサーバサイドで任意のコンテンツを挿入したり置き換えたり出来る。

§4.1 インストール

あらかじめコンパイル時に必要となるhttpd-devel(Fedoraの場合)をインストールしておく。

yum install httpd-devel

mod_layoutをダウンロード・コンパイルする。

wget http://download.tangent.org/mod_layout-5.1.tar.gz
tar xvzf mod_layout-5.1.tar.gz
cd mod_layout-5.1
make

コンパイル出来たらインストールする(標準で/usr/lib/httpd/modules/にインストールされる)。

make install

httpd.confを開き、下記のエントリが追加されていることを確認しておく。

LoadModule layout_module /usr/lib/httpd/modules/mod_layout.so

§4.2 ヘッダ・フッタを挿入する

拡張子htmlのファイルに対して、bodyタグの直後にヘッダ、直前にフッタを挿入する。

AddOutputFilter LAYOUT html
LayoutHeader /var/www/common/layout/header.html
LayoutFooter /var/www/common/layout/footer.html

AddOutputFilterで挿入する対象のファイルを指定し、LayoutHeaderとLayoutFooterで挿入するコンテンツを指定する。