mod_mime
Content-Typeで返すcharsetを変える
デフォルトのcharsetを変える場合はAddDefaultCharsetで指定する。 AddDefaultCharsetはtext/plainあるいはtext/htmlに適用される。 拡張子別に指定する場合は、AddCharsetを用いる。
このように設定するとMIME Typeがtext/plain, text/htmlのファイルおよび.xhtml, .xml, .rdfの拡張子を持つファイルの場合はcharsetにutf-8が設定される。 AddDefaultCharset Offにすると設定を無効にできる。
gzip圧縮されたファイルを展開した状態で表示させる
AddEncodingを設定することでレスポンスの内容エンコーディング(Content-Encoding)を指定できる。 例えば.diff.gzの拡張子を持つファイルについて、AddEncodingで内容エンコーディングにgzipやcompressを指定して返せば、UA側では解凍した状態で表示するようになる。
設定の各行の詳細な意味は次のとおり。
- <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を見て表示出来ない形式として判断しているため?)。
mod_rewrite
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
- 拡張子.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
/?foo=barの形式でのリクエストを別のスクリプトにリダイレクトする
URLにCGI等のスクリプトファイル名を指定しないでクエリだけが指定されている場合に、そのリクエストを別のスクリプトにリダイレクトする例。
設定の各行の詳細な意味は次のとおり。
- 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"にリダイレクトされない)が、何も含まれていない場合でもリダイレクトしたい場合は、
とする。
mod_autoindex
mod_autoindexのカスタマイズに関するメモ。 参考資料: mod_autoindex - Apache HTTP サーバ
表示されるアイコンを変える
まず、アイコンが表示されるためには、IndexOptionsディレクティブにFancyIndexingが設定されていなければならない。
次に、ファイルの種類を表すアイコンを変えるには、AddIconディレクティブを使用する。 これは、表示するアイコンを拡張子毎に設定するためのもので、MIMEタイプ毎にアイコンを設定するAddIconByTypeというディレクティブも存在する。 以下は設定例(ここではiconsディレクトリ以下にアイコンファイルが格納されているものとする)。
^^DIRECTORY^^はディレクトリを表すアイコン、^^BLANKICON^^はヘッダ部分のアイコンを設定するものを表す。 DefaultIconディレクティブを使用すると、AddIconで設定したいずれの条件にも該当しなかった場合のアイコンを設定することが出来る。
Descriptionのカラムに表示されるテキストを設定する
AddDescriptionディレクティブにて、Descriptionのカラムに表示されるテキストを設定することが出来る。 拡張子だけではなく、直接ファイル名を指定したりワイルドカードを使用することも出来る(例えばReadMe.*など)
ちなみに、DefaultDescriptionのようなディレクティブが存在しないようなので、この例では「AddDescription "?" *」でいずれの条件にも該当しない場合に表示されるテキストを設定している。
また、アイコン部分にもファイルへのリンクを設定したい場合は、IndexOptionsディレクティブにてIconsAreLinksオプションを指定する。
デフォルトの並び順を設定する
IndexOrderDefaultディレクティブを指定すると、デフォルトの並び順を指定することが出来る。
指定方法は「IndexOrderDefault [昇順/降順] [並べ替え順]」。 Ascending(昇順)またはDescending(降順)を指定する。 並べ替え順には、Name(ファイル名)、Date(更新日)、Size(サイズ)、Description(説明)のいずれかを指定する。 上記の例だと、ファイルのサイズが大きい順位並べ替えられて表示される。
また、ファイル名にバージョンが付与されている場合について、バージョン順で並べ替えを行わせるには、IndexOptionsディレクティブにてVersionSortオプションを指定する。
ディレクトリを一番始めに表示させる
ファイル・ディレクトリをまとめて並べ替えるのではなく、どのような順序で並べ替えてもディレクトリは一番始めに表示されるようにするためには、IndexOptionsディレクティブにてFoldersFirstオプションを設定する。
ファイルの一覧をtableとして出力させる
IndexOptionsディレクティブにHTMLTableオプションを追加することで、ファイル一覧をtableとして出力させることが出来る。
ヘッダ・フッタをオリジナルのものにする
特に設定をしなければデフォルトのヘッダとフッタが表示されるが、ここにオリジナルのものを読み込ませるにはHeaderNameおよびReadmeNameディレクティブを使用する。 HeaderNameで指定したファイルがファイル一覧の上、ReadmeNameで指定したファイルがファイル一覧の下にそれぞれ読み込まれて表示される。 そのため、それぞれヘッダ、フッタとして使用するファイルを指定することが出来る。
デフォルトで表示される分割線を表示させたくない場合は、IndexOptionsディレクティブにSuppressRulesオプションを追加する。 また、<html>や<body>などのタグを自分で設定したい場合は、IndexOptionsディレクティブにSuppressHTMLPreambleオプションを追加することで、<html>や<body>を出力させないようにすることが出来る。
ファイル名に日本語文字が含まれていて文字が化けてしまう場合などは、SuppressHTMLPreambleオプションを追加し、HeaderNameで読み込まれるように設定したファイルにてHTML文書の文字コードをシステムの文字コードにあわせるようにすればよい。
以下は、上記header.htmlとfooter.htmlの一例。
header.html
footer.html
SuppressHTMLPreambleを指定すると現在のディレクトリ名が表示されなくなってしまうので、SSIを使用して表示させている(<!--#echo var="REQUEST_URI" -->の部分)。 当然、SSIを有効にしていなければ表示されない。
mod_layout
mod_layoutに関するメモ。 mod_layoutを使うと、SSIのようにサーバサイドで任意のコンテンツを挿入したり置き換えたり出来る。
インストール
あらかじめコンパイル時に必要となるhttpd-devel(Fedoraの場合)をインストールしておく。
mod_layoutをダウンロード・コンパイルする。
コンパイル出来たらインストールする(標準で/usr/lib/httpd/modules/にインストールされる)。
httpd.confを開き、下記のエントリが追加されていることを確認しておく。
ヘッダ・フッタを挿入する
拡張子htmlのファイルに対して、bodyタグの直後にヘッダ、直前にフッタを挿入する。
AddOutputFilterで挿入する対象のファイルを指定し、LayoutHeaderとLayoutFooterで挿入するコンテンツを指定する。