.htaccessの書き方

公開日:
更新日:
0.htaccess
目次
  1. .htaccess とは
  2. .htaccess のルール
    1. ファイル名
    2. コメントアウト
    3. 文字コードと改行
    4. httpd.conf
    5. 転送と有効範囲
      1. 階層別に同じ設定項目がある場合
      2. 階層別に異なる設定項目がある場合
      3. 各階層の設定が有効になる場合
    6. 正規表現
      1. 正規表現が使用できるディレクティブ
  3. Apache のモジュールと .htaccess で利用可能なディレクティブ
    1. コア機能
      1. AcceptPathInfo ディレクティブ
      2. AddDefaultCharset ディレクティブ
      3. AddOutputFilterByType ディレクティブ
      4. AuthName ディレクティブ
      5. AuthType ディレクティブ
      6. CGIMapExtension ディレクティブ
      7. ContentDigest ディレクティブ
      8. DefaultType ディレクティブ
      9. EnableMMAP ディレクティブ
      10. EnableSendfile ディレクティブ
      11. ErrorDocument ディレクティブ
      12. FileETag ディレクティブ
      13. ディレクティブ
      14. ディレクティブ
      15. ForceType ディレクティブ
      16. ディレクティブ
      17. ディレクティブ
      18. ディレクティブ
      19. ディレクティブ
      20. LimitRequestBody ディレクティブ
      21. LimitXMLRequestBody ディレクティブ
      22. Options ディレクティブ
      23. Require ディレクティブ
      24. RLimitCPU ディレクティブ
      25. RLimitMEM ディレクティブ
      26. RLimitNPROC ディレクティブ
      27. Satisfy ディレクティブ
      28. ScriptInterpreterSource ディレクティブ
      29. ServerSignature ディレクティブ
      30. SetHandler ディレクティブ
      31. SetInputFilter ディレクティブ
      32. SetOutputFilter ディレクティブ
    2. mod_actions
      1. Action ディレクティブ
    3. mod_alias
      1. Alias ディレクティブ
      2. Redirect ディレクティブ
      3. RedirectMatch ディレクティブ
      4. RedirectPermanent ディレクティブ
      5. RedirectTemp ディレクティブ
    4. mod_auth_basic
      1. AuthBasicAuthoritative ディレクティブ
      2. AuthBasicProvider ディレクティブ
    5. mod_authn_default
      1. AuthDefaultAuthoritative ディレクティブ
    6. mod_authn_file
      1. AuthUserFile ディレクティブ
    7. mod_authz_default
      1. AuthzDefaultAuthoritative ディレクティブ
    8. mod_authz_groupfile
      1. AuthGroupFile ディレクティブ
      2. AuthzGroupFileAuthoritative ディレクティブ
    9. mod_authz_host
      1. Allow ディレクティブ
      2. Deny ディレクティブ
      3. Order ディレクティブ
    10. mod_authz_user
      1. AuthzUserAuthoritative ディレクティブ
    11. mod_autoindex
      1. AddAlt ディレクティブ
      2. AddAltByEncoding ディレクティブ
      3. AddAltByType ディレクティブ
      4. AddDescription ディレクティブ
      5. AddIcon ディレクティブ
      6. AddIconByEncoding ディレクティブ
      7. AddIconByType ディレクティブ
      8. DefaultIcon ディレクティブ
      9. HeaderName ディレクティブ
      10. IndexHeadInsert ディレクティブ
      11. IndexIgnore ディレクティブ
      12. IndexOptions ディレクティブ
      13. IndexOrderDefault ディレクティブ
      14. IndexStyleSheet ディレクティブ
      15. ReadmeName ディレクティブ
    12. mod_env
      1. PassEnv ディレクトリ
      2. SetEnv ディレクトリ
      3. UnsetEnv ディレクトリ
    13. mod_expires
      1. ExpiresActive ディレクトリ
      2. ExpiresByType ディレクトリ
      3. ExpiresDefault ディレクトリ
    14. mod_filter
      1. FilterChain ディレクトリ
      2. FilterDeclare ディレクトリ
      3. FilterProtocol ディレクトリ
      4. FilterProvider ディレクトリ
    15. mod_headers
      1. Header ディレクティブ
      2. RequestHeader ディレクティブ
    16. mod_imagemap
      1. ImapBase ディレクティブ
      2. ImapDefault ディレクティブ
      3. ImapMenu ディレクティブ
    17. mod_include
      1. SSIEnableAccess ディレクティブ
      2. SSIEndTag ディレクティブ
      3. SSIErrorMsg ディレクティブ
      4. SSIETag ディレクティブ
      5. SSILastModified ディレクティブ
      6. SSIStartTag ディレクティブ
      7. SSITimeFormat ディレクティブ
      8. SSIUndefinedEcho ディレクティブ
      9. XBitHack ディレクティブ
    18. mod_mime
      1. AddCharset ディレクティブ
      2. AddEncoding ディレクティブ
      3. AddHandler ディレクティブ
      4. AddInputFilter ディレクティブ
      5. AddLanguage ディレクティブ
      6. AddOutputFilter ディレクティブ
      7. AddType ディレクティブ
      8. DefaultLanguage ディレクティブ
      9. MultiviewsMatch ディレクティブ
      10. RemoveCharset ディレクティブ
      11. RemoveEncoding ディレクティブ
      12. RemoveHandler ディレクティブ
      13. RemoveInputFilter ディレクティブ
      14. RemoveLanguage ディレクティブ
      15. RemoveOutputFilter ディレクティブ
      16. RemoveType ディレクティブ
    19. mod_negotiation
      1. ForceLanguagePriority ディレクティブ
      2. LanguagePriority ディレクティブ
    20. mod_setenvif
      1. BrowserMatch ディレクティブ
      2. BrowserMatchNoCase ディレクティブ
      3. SetEnvIf ディレクティブ
      4. SetEnvIfNoCase ディレクティブ
    21. mod_dir
      1. DirectoryIndex ディレクティブ
      2. DirectorySlash ディレクティブ
      3. FallbackResource ディレクティブ
    22. mod_rewrite
      1. RewriteEngine ディレクティブ
      2. RewriteBase ディレクティブ
      3. RewriteRule ディレクティブ
      4. RewriteCond ディレクティブ
      5. RewriteOptions ディレクティブ
  4. HTTP環境変数
    1. ヘッダ環境変数 - HTTP headers
      1. HTTP_USER_AGENT
      2. HTTP_REFERER
      3. HTTP_COOKIE
      4. HTTP_FORWARDED
      5. HTTP_HOST
      6. HTTP_PROXY_CONNECTION
      7. HTTP_ACCEPT
    2. サーバー環境変数 - server internals
      1. DOCUMENT_ROOT
      2. SERVER_ADMIN
      3. SERVER_NAME
      4. SERVER_ADDR
      5. SERVER_PORT
      6. SERVER_PROTOCOL
      7. SERVER_SOFTWARE
    3. リクエスト環境変数 - connection & request
      1. REMOTE_ADDR
      2. REMOTE_HOST
      3. REMOTE_PORT
      4. REMOTE_USER
      5. REMOTE_IDENT
      6. REQUEST_METHOD
      7. SCRIPT_FILENAME
      8. PATH_INFO
      9. QUERY_STRING
      10. AUTH_TYPE
    4. システム日付・時刻変数 - date and time
      1. TIME_YEAR
      2. TIME_MON
      3. TIME_DAY
      4. TIME_HOUR
      5. TIME_MIN
      6. TIME_SEC
      7. TIME_WDAY
      8. TIME
    5. その他 - specials
      1. API_VERSION
      2. THE_REQUEST
      3. REQUEST_URI
      4. REQUEST_FILENAME
      5. IS_SUBREQ
      6. HTTPS
  5. 後方参照
    1. RewriteRuleの後方参照
    2. RewriteCondの後方参照
  6. まとめ

.htaccess とは

.htaccess とは、Webサーバの動作を制御するための設定ファイル※1です。設定例としては、特定のファイルやディレクトリのアクセスを禁止したり、HTTP 404(Not Found:未検出)エラーページをカスタマイズすることもできます。.htaccess は設置しなくともWebサイトは問題なく動作しますが、セキュリティやパフォーマンスの観点から導入をおすすめします。


以降は、さくらインターネットのレンタルサーバで .htaccess を利用する場合について説明します。レンタルサーバによっては .htaccess の利用を禁止している場合や、設定できない項目もありますので、利用できるかは公式ヘルプページを参照するようにしましょう。また、詳細な情報については Apache の公式ドキュメントを参照して下さい。


Apache HTTP サーバ バージョン 2.2

また、".htaccess 自動作成" のページではオンライン上から .htaccess ファイルを簡単に作成するサービスも提供していますので、必要に応じてご利用下さい。

.htaccess のルール

.htaccess の書き方にはルールがあり、ルールを違反すると "500 internal server error" が発生します。500 internal server error が発生すると、以下のような画面が表示されWebページが表示されなくなります。そのため .htaccess を設置する場合は十分な動作確認を行いましょう。


500 internal server error
500 internal server error

ファイル名

.htaccess のファイル名は、そのまま ".htaccess" になります。先頭に . がついていることに注意して下さい。先頭に . がつくファイルはUNIX系のOSで隠しファイルを意味しており、ファイル名がない拡張子だけのファイルという意味ではありません。


Windowsでは初期設定で拡張子の表示が省略されているため、ファイル名が気付かずに ".htaccess.txt" となっている場合があります。".htaccess.txt" では、サーバが正しく認識できないため、動作しません。また、拡張子が自動で付与されて ".htaccess" というファイル名が作成できない場合は、 ".htaccess.txt" のファイル名で一旦作成し、アップロード後にWebサーバ上で ".htaccess" にリネームします。


ただし .htaccess のファイル名は後述する httpd.conf の AccessFileName ディレクティブで定義することができるため、必ずしも .htaccess ではない場合があります。もしも .htaccess が機能せず、500 internal server error も発生しない場合は .htaccess のファイル名を確認してみて下さい。以下は .htaccess のファイル名を .acl に変更している例です。


# 設定ファイル名を .htaccess ではなく .acl にしている例
AccessFileName .acl
 httpd.conf に含まれている .htaccess の設定例

コメントアウト

.htaccess では、# から始まる行がコメントアウトされます。行の途中でもコメントをつけることが可能ですが、Apacheのバージョンや、記述場所によってはエラーになるため、基本的にコメント行は独立させましょう。それでも行の途中でコメントをつける場合は、" で囲むことでコメントアウトされます。ただし、Apache ver1.3系ではエラーになるため、Apache ver2.0系以降である必要があります。


# ここはコメント行です
DirectoryIndex index.html "# 行の途中コメントは避けましょう"
 .htaccess におけるコメントアウト

文字コードと改行

.htaccess の文字コードはUTF-8(BOM無し)、改行コードはLFを設定し、ファイルの最終行には空行を入れる必要があります。ただし .htaccess が日本語などの全角文字を含まず、半角英数字だけである場合は文字コードは Shift-JIS や EUC-JP などでも問題ありません。文字コードや、改行コードが誤っている場合は、500 internal server error が発生するため注意が必要です。


特に Windows 環境では、プレーンな .htaccess を作成するためにテキストエディタが必要になります。メモ帳では保存時の文字コードで UTF-8 が選択できますが、BOMが付与されてしまいます。また、ワードパッドではリッチテキスト形式となり、余計なバイナリ情報が付与されるため .htaccess が機能しないため注意しましょう。


また、改行は構文の終端として認識されますが、行末に \ をつけて改行すると構文が次の行に継続しますが、あまり一般的な表記ではありません。途中改行を行う場所によってはエラーになるため、特に必要でない限りは途中改行も避けた方が無難です。


# ErrorDocument 404 404error.html を途中で改行する
ErrorDocument 404 \
404error.html

# 最終行の後には空行を入れましょう
 .htaccess における改行

httpd.conf

httpd.conf は .htaccess の上位ファイルです。そのため .htaccess では httpd.conf で許可されている命令のみ指定できます。許可されていない命令を指定した場合、無効になるか 500 internal server error が発生します。何が許可されているかは、利用しているサーバの公式ヘルプを確認して下さい。例えば、さくらインターネットでは、ディレクトリの一覧表示を制御する Options の指定は許可されていません。


もしも httpd.conf を確認できる場合は、 "AllowOverride" ディレクティブを探してみましょう。デフォルトの設定では、httpd.conf に AllowOverride ディレクティブが含まれていますが、見つからない場合は、追記することで設定できます。


# None は .htaccess による設定をすべて無効にする
<Directory />
  AllowOverride None
</Directory>
 httpd.conf に含まれている .htaccess の設定例

転送と有効範囲

.htaccess をWebサーバへ転送する際はアスキーモードで転送します。転送後は .htaccess のパーミッションを "644(rw-r--r--)" に設定します。ただし、共有サーバでは、"604(rw----r--)" の場合もあります。


.htaccess の設定は、配置したディレクトリ以下に対して有効になります。そのため、Webサイト全体に対して設定を有効にしたい場合は、ルートディレクトリに配置しましょう。階層別に分けて配置した場合、より深い階層に配置した .htaccess の設定が優先されます。


/www
|-- .htaccess         # Webサイト全体に対して有効 ・・・ A
|-- index.html        # Aの設定が有効になる
|
|-- /contents
|   |-- contents.html # Aの設定が有効になる
|
|-- /blog
    |-- .htaccess     # blog配下に対して有効 ・・・ B
    |-- blog.html     # Bの設定が有効になる
 階層別における .htaccess の有効範囲

上記の例では .htaccess A と .htaccess B で同じ設定項目を使用している場合に限ります。同じ設定項目を使用している場合、より深い階層に配置した .htaccess の設定で上書きされますが、その他の設定項目は上位の階層の設定が有効になります。

階層別に同じ設定項目がある場合

# .htaccess Aの設定
RewriteEngine On
RewriteRule index1.html index2.html

# .htaccess Bの設定
RewriteEngine On
RewriteRule index1.html index3.html
 同じ設定項目は上書きされる

上記の例では RewriteRule が .htaccess A と .htaccess B に書かれています。.htaccess に同じ設定項目がある場合、より深い階層の設定が有効になるため /blog にアクセスすると .htaccess A の設定が .htaccess B の設定で上書きされます。そのため blog/index1.html にアクセスした場合 index3.html に書き換わります。

階層別に異なる設定項目がある場合

# .htaccess Aの設定
DirectoryIndex index.html

# .htaccess Bの設定
RewriteEngine On
RewriteRule index1.html index2.html
 異なる設定項目は継承される

上記の例では異なる設定項目が .htaccess A と .htaccess B に書かれています。.htaccess に異なる設定項目がある場合 .htaccess A の設定が .htaccess B にも継承されます。

各階層の設定が有効になる場合

# .htaccess Aの設定
RewriteEngine On
RewriteRule index1.html index2.html

# .htaccess Bの設定
RewriteEngine On
RewriteRule index1.html /index1.html
 書き換え後の階層の設定が有効になる

上記の例ではやや複雑な設定になっています。 blog ディレクトリの blog/index1.html にアクセスすると .htaccess B の設定が有効になり、ルートディレクトリの index1.html に書き換わります。書き換え後のパスに / がついていると絶対パスになり、ルートディレクトリになります。


ルートディレクトリの index1.html に書き換わると .htaccess A の設定が有効になり、最終的には index2.html に書き換わります。このように、ディレクトリを跨ぐ書き換えが行われると書き換わった先のディレクトリで有効な .htaccess の設定が改めて適用されます。.htaccess を階層別に分けて配置する場合は、適用される有効範囲について注意しましょう。

正規表現

.htaccess では、正規表現による指定が可能です。正規表現とは、いくつかの文字列を1つの形式で表現する記述方法です。例えば、index1.html と index2.html がある場合、以下の正規表現で表すことができます。


index(1|2).html

"(" , ")" で囲んだ部分は1つのグループとなり、複数の文字を1つの単位として扱うことができます。"|" はOR条件を表すため、正規表現の意味としては "index" に続く文字が "1" または "2" となります。このように、正規表現を使用すればファイル名などを柔軟に指定することが可能です。

基本的な正規表現
文字説明
.任意の1文字 にマッチします。
+直前の文字が 1回以上 繰り返す場合にマッチします。
"go+gle" は "gogle" や "google" にはマッチしますが "ggle" にはマッチしません。
*直前の文字が 0回以上 繰り返す場合にマッチします。
"go*gle" は "gogle" や "google" や "ggle" にマッチします。
?直前の文字が 0個か1個 ある場合にマッチします。
"go?gle" は "gogle" や "ggle" にマッチしますが "google" にはマッチしません。
^直後の文字が行の 先頭 にある場合にマッチします。
"^google" は行の先頭に "google" の文字がある場合にマッチします。
$直前の文字が行の 末尾 にある場合にマッチします。
"google$" は行の末尾に "google" の文字がある場合にマッチします。
|選択肢を区切るために使われます。
"google|googol" は "google" と "googol" にマッチします。
"goog(le|ol)" と表記しても同様の結果を得られます。
\直後の "正規表現において特別な意味を持つ" 文字を エスケープ する。
"go\+gle" は "go+gle" にマッチします。
正規表現における "+" の意味を失い "+" 文字として扱います。
[]角括弧に含まれる文字のいずれか1つにマッチします。
[abcXYZ01] は "a" , "b" , "c" , "X" , "Y" , "Z" , "0" , "1" にマッチします。

角括弧内の文字を "-" を使って範囲指定のマッチもできます。
[a-cX-Z0-1] は "a" , "b" , "c" , "X" , "Y" , "Z" , "0" , "1" にマッチします。

角括弧内の先頭に "^" を使って含まれない文字のマッチもできます。
[^abc] は "a" , "b" , "c" 以外の文字にマッチします。
()文字の集合を1つのグループにまとめて扱うことができます。
(google)+ は "google" を1つの単位として評価するため "google" にマッチします。
また、マッチング文字列は後述する "後方参照" として利用できます。
{n,m}直前の文字、またはグループの桁数を指定してマッチ判定します。
a{3} は a が3桁、つまり "aaa" にマッチします。
a{3,5} は a が3~5桁、つまり "aaa" , "aaaa" , "aaaaa" にマッチします。
a{3,} は a が3桁以上にマッチします。


正規表現には基本的な表記の他に定義済みのクラスがあります。一部の定義済みクラスは "[:" と ":]" の特殊な括弧を使用することで表記します。

定義済みの正規表現クラス
文字対応する表現説明
\d[0-9]すべての数字
\D[^0-9]すべての数字以外の文字
\s[ \t\f\r\n]垂直タブ以外のすべての空白文字
\S[^ \t\f\r\n]すべての非空白文字
\w[a-zA-Z_0-9]アルファベット、アンダーバー、数字
\W[^a-zA-Z_0-9]アルファベット、アンダーバー、数字以外の文字
[:digit:][0-9]すべての数字
[:lower:][a-z]小文字のアルファベット
[:upper:][A-Z]大文字のアルファベット
[:alpha:][a-zA-Z]アルファベット
[:xdigit:][0-9A-Fa-f]16進数で使われる数字とアルファベット
[:alnum:][a-zA-Z0-9]アルファベットと数字
[:punct:][.,!?:...]句読点文字
[:cntrl:](なし)制御文字
[:blank:][ \t]空白文字とタブ
[:graph:][^\n\r\f\v]印字文字
[:space:][ \t\n\r\f\v]改行を含む空白文字

正規表現が使用できるディレクティブ

.htaccess では正規表現が使用できますが、すべてのディレクティブで正規表現が使用できるわけではありません。使用できるディレクティブは "Match" という単語が名前に含まれているディレクティブ(例えば FilesMatchなど)や、次章以降の RewriteRuleディレクティブ、RewriteCondディレクティブでは正規表現が使用できます。

Apache のモジュールと .htaccess で利用可能なディレクティブ

Apache の使用可能なモジュールの中から .htaccess で利用可能なディレクティブを説明します。Apache は、基本的に組み込まれている "コア機能" と呼ばれるディレクティブと、モジュールを追加することで機能が拡張されたディレクティブがあります。モジュール名は、習慣的に mod_XXX (XXXは機能の概要名)という名前になっています。


Apache は必要最低限の機能を http_core.c にまとめ、その他の付加的な機能は個別にモジュールとして実装しています。モジュールの追加や削除を行うことで、機能の最適化が可能です。以下は、Apache のモジュールアーキテクチャの概念図です。


Apacheのモジュールアーキテクチャ
Apache のモジュールアーキテクチャの概念図
(参考:小山 浩之(著)「Apacheモジュール プログラミングガイド」P16 図1-1)


モジュールの追加方法は、"静的リンク" と "動的リンク" の 2 種類あります。静的リンクは、Apache の実行ファイルにモジュールを組み込む方式です。動的リンクは、必要に応じてモジュールファイルを機能を呼び出す方式です。動的リンクの機能を利用するためには、mod_so モジュールを静的リンクしておく必要があります。また、動的リンクは静的リンクよりも負荷がかかりますが、Apache の再起動のみでモジュールを追加・削除できるメリットがあります。逆に、静的リンクは高速にモジュールを呼び出せますが、Apache の再コンパイルを行う必要があります。レンタルサーバーを利用している場合は、Apache を操作する権限がない場合が多いため、利用できるモジュールが制限される可能性があります。


もしも httpd コマンドの実行許可を持つユーザである場合は、Apache に組み込まれているモジュールを確認することができます。httpd コマンドに -M オプションを付けることで静的リンクのモジュール (static) と 動的リンクのモジュール (shared) が表示されます。


# httpd コマンドで利用可能なモジュールを確認する
[root@ ~]# /etc/init.d/httpd -M
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
authn_file_module (shared)
authn_dbm_module (shared)
・・・(中略)・・・
Syntax OK

[root@ ~]# 
 Apache の利用可能なモジュールを確認する例

ただし、httpd -M コマンドでは、サードパーティー製のモジュールも一緒に表示されるため、Apache が採用している静的リンクのモジュールのみ表示したい場合は、httpd -l コマンドを使用します。


# httpd コマンドで利用可能なモジュールを確認する
[root@ ~]# /etc/init.d/httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
・・・(中略)・・・

[root@ ~]# 
 Apache の利用可能なモジュールを確認する例

コア機能

以下は、通常は常に使用可能な Apache 2.2 のコア機能のディレクティブの一覧です。ただし、ディレクティブによっては httpd.conf で許可していない可能性があるため、下記のディレクティブがすべて利用可能であるとは限りません。例えば、さくらインターネットのレンタルサーバーでは、Options ディレクティブなどは利用できません。


また、さくらインターネットのヘルプデスクに問い合わせた結果、利用可能なモジュール、ディレクティブは非公開との回答を得ているため、公式アナウンスのあるもの以外は、自身でテストを行う必要があります。

AcceptPathInfo ディレクティブ

AcceptPathInfo ディレクティブは、ファイル名の後ろに続く "パス名の情報" (PATH_INFO) のリクエストを受け付けるか、拒否するかを制御します。例えば、https://murashun.jp/index.html/hoge の場合は、/hoge が環境変数 PATH_INFO に格納されます。/hoge は、存在しないパスであるため、HTTP ステータス 404 エラー (Not Found) が返されると思うかもしれませんが、通常通り指定したファイルが返されます。もしも、存在しないパスに対して HTTP ステータス 404 エラー (Not Found) を返したい場合は、明示的に Off または Default を設定します。以下は 本ディレクティブの構文となります。


# AcceptPathInfo ディレクティブの構文
AcceptPathInfo On|Off|Default
 AcceptPathInfo ディレクティブの構文
# AcceptPathInfo の設定例
AcceptPathInfo Off
 AcceptPathInfo の設定例

AcceptPathInfo ディレクティブに指定可能な値は以下の通りです。

AcceptPathInfo ディレクティブに指定可能な値
説明
Off存在しないパスのリクエストは受け付けません。そのため、index.html/hoge にリクエストがあった場合は HTTP ステータス 404 エラー (Not Found) エラーを返します。
On前方のディレクトリが存在するリクエストを受け付けます。そのため、index.html/hoge などは受け付けられます。
Default後方のパス情報はリクエストのハンドラによって決まります。CGI などで環境変数 PATH_INFO を扱う場合はリクエストを受け付け、扱わない場合は受け付けず HTTP ステータス 404 エラー (Not Found) を返します。


AcceptPathInfo ディレクティブ - Apache HTTP サーバ バージョン 2.2

Apache サーバの仕様では実際には存在しない URL でもページが表示される場合があります。例えば、ファイルを保存しているディレクトリ名がネストしている場合や、ディレクトリに 1 ファイルしか存在しない場合に発生します。


具体的には https://murashun.jp/top/example.html というファイルパスがあった場合、以下の存在しない URL でもページが表示されます。


  • https://murashun.jp/top/top/top/example.html
  • https://murashun.jp/top/top/top/
  • https://murashun.jp/top/example/
  • https://murashun.jp/top/example

上記のような存在しない URL に対して HTTP ステータス 404 エラー (Not Found) エラーを返すには、明示的に AcceptPathInfo ディレクティブで Off または Default を設定します。


# AcceptPathInfo の設定例
AcceptPathInfo Default
 AcceptPathInfo の設定例

存在しないページがブラウザに表示されます|さくらインターネット公式サポートサイト

AddDefaultCharset ディレクティブ

AddDefaultCharset ディレクティブは、レスポンスの MIMEタイプ(Content-Type) が text/plain または text/html の場合に文字エンコーディングのデフォルト値を指定できます。HTML の meta タグで charset を設定していても、本ディレクティブが設定されている場合は、本ディレクティブの設定が優先されます。そのため、ファイルのエンコーディングと、本ディレクティブの設定が異なっている場合、文字化けの原因になります。


% curl -I https://murashun.jp/
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8 # charset が utf-8 に設定されている
 AddDefaultCharset の確認例

Webサイトで使用する文字エンコーディングは、(例えば UTF-8 で)固定しておくと良いでしょう。AddDefaultCharset ディレクティブをコメントアウト、または Off の設定で無効化しておくのも一つの方法です。すべてのテキストリソースが正しくエンコーディングされていて、charset が適切にされている場合は設定する必要はありません。ただし、クロスサイトスクリプティングを利用した攻撃を防止する上でも、設定することを推奨します。


# AddDefaultCharset の設定例
AddDefaultCharset utf-8
 AddDefaultCharset の設定例

AddDefaultCharset ディレクティブに指定可能な値は以下の通りです。

AddDefaultCharset ディレクティブに指定可能な値
説明
OffMIMEタイプ(Content-Type) が text/plain または text/html の charset を無効化します。Offはデフォルト値であるため、このディレクティブ自体をコメントアウトした場合も同様です。
OnApache 内部のデフォルト文字セット iso-8859-1 に設定されます。
(任意の文字コード)IANAに登録されている文字セットを設定できます。

AddDefaultCharset ディレクティブを使うことで、文字化け対策を行うことができます。文字化け対策を行うためには .htaccess で設定を行う他にもいくつかの注意点があります。まずテキストエディタで HTML ファイルを作成しますが、ここで保存するときに文字エンコーディングを選択します。この保存時の文字エンコーディングがベースの文字コードとなります。一般的には、"UTF-8" (BOMなし) を選択します。


次に .htaccess で以下のようにデフォルトの文字コードを設定します。


# AddDefaultCharset の設定例
AddDefaultCharset utf-8
 AddDefaultCharset の設定例

通常は、上記までの設定でも問題ありませんが、AddType ディレクティブの設定で、extension (拡張子) に指定された MIME-type (MIME タイプ(Content-Type)) の関連付けを行うことができます。


# AddType の設定例
AddType "text/html; charset=UTF-8" .html
 AddType の設定例

Web サイトで使う文字コードは統一した上で、上記の設定を行うと文字化けを回避することができます。テキストエディタによっては、通常の文字コードが Shift_JIS で保存するものもあるため、気付かずに文字コードが異なる場合があります。その場合は .htaccess の設定とあわせて、ファイルの文字コードも確認してみて下さい。


文字コードが設定は非常に重要です。文字化けを発生させないことはもちろん、正しく設定されていない場合は、クロスサイトスクリプティング (XSS) 攻撃のリスクを抱えることになります。


例えば、Google の HTTP 404 エラー (Not Found) のページには、リクエストされた URL のパス名を画面に表示するようになっており、そのパス名に HTML タグが埋め込まれた場合、"&lt;""&gt;" にエスケープして出力するように実装されています。しかし、2005 年までは HTTP 404 エラーページの文字エンコーディングを指定していませんでした。そのため、Internet Explorer などのブラウザでは、ページのエンコーディングが指定されていない場合、自動的にエンコーディングする機能が働くため、例えば自動的に UTF-7 エンコードされる XSS 攻撃文字列を URL に含めて Google の HTTP 404 エラーページを表示させる攻撃の場合、任意の JavaScript コードが実行されてしまう問題点が過去にありました。


本ディレクティブは 1 行で完了するため、クロスサイトスクリプティングを利用した攻撃を防ぐ上でも設定することを推奨します。

AddOutputFilterByType ディレクティブ

AddOutputFilterByType ディレクティブは MIMEタイプ(Content-Type) に応じて出力フィルターを使用することができます。フィルターとは、サーバが送受信したデータに適用する処理のことを言います。出力フィルターは、Webサーバからクライアントにレスポンスを返すデータに処理を行うフィルターを指します。ただし、Apache 2.0.33 以降で使用可能ですが、Apache 2.1 以降で本ディレクティブは非推奨となり、代わりに同等の機能を持つ mod_filter を使用することが推奨されています。


非推奨の理由は、MIMEタイプ(Content-Type)が不明な場合はフィルターが部分的、または完全に有効にならないためです。AddOutputFilterByType ディレクティブはまだ機能していますが、可能な限り使用は避けた方が良いでしょう。詳細は、mod_filter のディレクティブを参照して下さい。また、mod_filiter は仕組みが難しいため、必要に応じて、"Apache のコンテンツフィルタリング" も参照して下さい。


以下の例では、特定の MIMEタイプ(Content-Type) をクライアントに送る前に圧縮 (DEFLATE) しています。ただし、さくらインターネットのレンタルサーバーでは、以下の方法では圧縮されません。詳細は、"gzip圧縮によるサイトパフォーマンスを向上させる方法"を参考にして下さい。


# AddOutputFilterByType の設定例
SetOutputFilter DEFLATE

# gzip をサポートしていないレガシーブラウザを除外
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# 圧縮済みの画像は再圧縮しない
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI _\.utxt$ no-gzip

# html や css などのテキストは圧縮する
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
 AddOutputFilterByType の設定例

AddOutputFilterByType ディレクティブ - Apache HTTP サーバ バージョン 2.2

AuthName ディレクティブ

AuthName ディレクティブは、Basic認証などを行う際に出力される、ダイアログに表示されるメッセージを指定することができます。このメッセージは、利用者がどのユーザ名とパスワードを入力すれば良いかを教えるために利用します。日本語も設定可能ですが、サーバやブラウザによって文字化けを起こす可能性があるため、半角英字で設定した方が無難です。また、メッセージにスペースが含まれる場合は " で囲む必要があります。


ただし、厳密な意味でのAuthName ディレクティブは、認可領域の名前となります。ブラウザで認証が必要なページに初めてアクセスした場合、サーバはブラウザに対して認証が必要であることを通知します。通知を受けると、ブラウザは認証ダイアログを表示し、ユーザにユーザ名とパスワードの入力を求めます。入力されたユーザ名とパスワードを元に、"Authorization" というヘッダーが作成されてリクエストが投げられます。サーバは Authorization ヘッダーを元に認証を行います。ブラウザは認証が必要な他のページにリクエストを投げる場合も、AuthName が同じである場合は Authorization ヘッダーを付けてリクエストを投げるようになります。そのため、AuthName が同じで、一度認証が完了している場合は、改めて認証することなくページの閲覧が可能になります。つまり、AuthName ディレクティブの厳密な使い方としては、認可する領域ごとに異なる名前を付けるべきだと考えます。


本ディレクティブは単体では利用できません。利用するには、AuthType ディレクティブ、Require ディレクティブ、AuthUserFile や AuthGroupFile のディレクティブと一緒に利用する必要があります。


# AuthName の設定例(他のディレクティブとセット)
AuthType Basic
# ダイアログに Top Secret と表示します
AuthName "Top Secret"
AuthUserFile "/home/murashun/passwords"
Require valid-user
 AuthName の設定例

AuthName ディレクティブのダイアログ例
AuthName ディレクティブのダイアログ例

AuthType ディレクティブ

AuthType ディレクティブは、ユーザー認証の種類を指定できます。使用できる認証方式は Basic または Digest です。


Basic 認証は最も基本的なユーザ認証方式です。認証を必要とするページにアクセスすると、ユーザ名とパスワードの入力が求められます。アクセスを許可しているユーザである場合は、ページを閲覧することができます。ただし、ユーザ名とパスワードは暗号化されていないため、プレーンテキストとしてサーバと送受信されるため、盗聴や改ざんのセキュリティリスクがあります。Basic 認証方式はどのブラウザでも対応しており、簡単に利用できる反面、セキュリティリスクが高く重要なデータの保護に向いていない特徴があります。


Digest 認証は、ユーザ名やパスワードの認証情報をハッシュ化してサーバと送受信する認証方式です。Basic 認証と比べてセキュリティリスクが低く、盗聴や改ざんを防止することができます。


# AuthType の設定例(他のディレクティブとセット)
# 認証方式を Basic 認証方式に設定
AuthType Basic
AuthName "Top Secret"
AuthUserFile "/home/murashun/passwords"
Require valid-user
 AuthType の設定例

本ディレクティブは単体では利用できません。利用するには、AuthName ディレクティブ、Require ディレクティブ、AuthUserFile や AuthGroupFile のディレクティブと一緒に利用する必要があります。

AuthType ディレクティブに指定可能な値
説明
BasicBasic 認証方式(mod_auth_basicで実装)となります。
DigestDigest 認証方式(mod_auth_digestで実装)となります。

CGIMapExtension ディレクティブ

CGIMapExtension ディレクティブは、Apache が CGI スクリプトを実行するためのインタープリタのパスと拡張子を指定できます。例えば、CGIMapExtension sys:/perl.nlm .cgi と指定すると、.cgi という拡張子のすべての CGI スクリプトが perl インタープリタに渡されます。ただし、本ディレクティブは、NetWare という Nobell社が開発したネットワークOSのみ互換性があるため、一般的に UNIX 系にインストールされている Apache では使用できません。


# NetWare 固有の設定例
# (sysボリュームのパスも.nlmの拡張子もNetWare固有のものです)
CGIMapExtension sys:/perl.nlm .cgi
 CGIMapExtension の設定例

ContentDigest ディレクティブ

ContentDigest ディレクティブは、Content-MD5 ヘッダーの生成を有効にします。Content-MD5 ヘッダーとは、HTTP ヘッダーに含まれており、コンテンツが通信途中で改ざんされていないかをチェックするためのデータ(128 bit の MD5 ダイジェストを BASE64 エンコードしたもの)を表します。そのため、コンテンツが途中で改ざんされた場合に検知することが可能になります。


# ContentDigest の設定例
ContentDigest On
 ContentDigest の設定例

% curl -I https://murashun.jp/
HTTP/1.1 200 OK
Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==  # Content-MD5 ヘッダーの例
 Content-MD5 ヘッダーの例

ただし、本ディレクティブはリクエスト毎にメッセージダイジェストを計算するため、サーバパフォーマンスが低下する点に注意して下さい。メッセージダイジェストの値はキャッシュされないため、純粋にパフォーマンスが低下します。さくらインターネットのレンタルサーバーで試しましたが、本ディレクティブは許可されていないようです。

ContentDigest ディレクティブに指定可能な値
説明
OnContent-MD5 ヘッダーの生成を有効にします。
OffContent-MD5 ヘッダーの生成を無効にします。

DefaultType ディレクティブ

DefaultType ディレクティブは、サーバがリクエストされたファイルの MIMEタイプ(Content-Type)を決定できない場合に、送る MIMEタイプ(Content-Type)を指定できます。Apache は、拡張子から mime.types という一覧を参照し、MIMEタイプ(Content-Type)を判断しています。しかし、mime.types に存在しない未定義のファイルがリクエストされた場合は、指定された MIMEタイプ(Content-Type)をクライアントに通知します。デフォルトでは text/plain が選択されています。


また、mime.types は AddType ディレクティブにより、MIMEタイプ(Content-Type)の追加・変更(上書き)が可能です。ただし、DefaultType が指定されていても MIMEタイプ(Content-Type)が決定できる場合は、DefaultType の指定された値は上書きされます。強制的に MIMEタイプ(Content-Type)指定する場合は、ForceType ディレクティブを使用します。


# DefaultType の設定例
DefaultType text/plain
 DefaultType の設定例

もしも、MIMEタイプ(Content-Type)が決定できない場合に、誤った MIMEタイプ(Content-Type)を指定するぐらいであれば、むしろ無いほうが良いという場合は None を指定できます。ただし、None の指定は httpd-2.2.7 以降で使えます。

DefaultType ディレクティブに指定可能な値
説明
(MIMEタイプ)MIMEタイプ(Content-Type)が決定できない場合に、指定された MIMEタイプ(Content-Type)を返します。
noneMIMEタイプ(Content-Type)が決定できない場合に、空を返します。

EnableMMAP ディレクティブ

EnableMMAP ディレクティブは、ファイルの転送中に内容を読み込む必要がある場合、httpd がメモリマッピングを使用するかを制御します。httpd とは UNIX系のOSの常駐プログラムのひとつであり、外部からのHTTPリクエストを受け付けファイルを転送したりします。その際に、転送するファイルの内容を読み込むためにメモリマッピングを使用するかどうかを制御します。


デフォルトの設定値はメモリマッピングを使用する設定になっています。例えば、SSIファイルなどを転送する場合、ファイルの中のコメント部分にサーバの実行コマンド結果を埋め込む必要があるため、ファイルにアクセスする際にメモリにマッピングします。


ただし、ファイルシステムが NFS でマウントされたボリュームに DocumentRoot がある場合、ファイルの削除や、ファイルサイズの変更に伴うセグメンテーションフォールトが原因で httpd がクラッシュする可能性があります。この問題が発生するサーバの設定の場合は、メモリマッピングを使用不可に設定することもできます。


# EnableMMAP の設定例
EnableMMAP Off
 EnableMMAP の設定例

# httpd.conf で NFS マウント部分のみ使用不可にする例
<Directory "/nfs-files">
  EnableMMAP Off
</Directory>
 httpd.conf で NFS マウント部分のみ使用不可にする例
EnableMMAP ディレクティブに指定可能な値
説明
Onファイル転送時にメモリマッピングを行います。
Offファイル転送時にメモリマッピングを行いません。

EnableSendfile ディレクティブ

EnableSendfile ディレクティブは、ファイルの転送中に httpd がカーネルの sendfile サポートを使用するかを制御します。カーネルの sendfile は、ファイルディスクリプタ間でデータを転送するために使われます。この転送方法は、カーネル空間上でデータのやりとりが行われているため、通常のユーザ空間上でデータをやりとりしている read と write を組み合わせるよりも効率が良くなります。また、本ディレクティブは、Apache 2.0.44 以降で使用可能です。


デフォルトの設定値はsendfile のサポートを使用する設定になっています。例えば、リクエストの処理を行う際に、データにアクセスの必要がない静的なファイルを転送する場合、ファイルを読み込むことなく sendfile を使ってファイルを転送します。


ただし、ファイルシステムが NFS や SMB でマウントされたボリュームに DocumentRoot がある場合、カーネルはキャッシュを使ってネットワークからファイルを転送することができない場合があります。この問題が発生するサーバの設定の場合は、sendfile のサポートを使用不可に設定することもできます。


# EnableSendfile の設定例
EnableSendfile Off
 EnableSendfile の設定例

# httpd.conf で NFS マウント部分のみ使用不可にする例
<Directory "/nfs-files">
  EnableSendfile Off
</Directory>
 httpd.conf で NFS マウント部分のみ使用不可にする例
EnableSendfile ディレクティブに指定可能な値
説明
Onsendfile のサポートを使用可能にします。
Offsendfile のサポートを使用不可にします。

ErrorDocument ディレクティブ

ErrorDocument ディレクティブは、問題やエラーが発生したときの動作を指定することができます。指定できる動作は、以下の 4 つがあります。デフォルトの動作は 1 番目の動作になります。

  1. Apache 標準のエラーメッセージを表示する
  2. 指定した任意のメッセージを表示する
  3. 内部サーバの別の URL にリダイレクトする
  4. 外部サーバの別の URL にリダイレクトする

2 番目から 4 番目は、HTTPのレスポンスコードとメッセージ、または URL を指定することで設定します。メッセージの場合は、" を付けて指定します。URL の場合は、/ で始まる DocumentRoot からの相対パス、または http などで始まる完全な URL を指定します。


# ErrorDocument の構文
ErrorDocument error-code document
 ErrorDocument の構文

HTTPステータスコード - Wikipedia

# Apache 標準のエラーメッセージを表示する
ErrorDocument 503 default
# 指定した任意のメッセージを表示する
ErrorDocument 403 "Sorry. 403 Forbidden."
# 内部サーバの別の URL にリダイレクトする
ErrorDocument 404 /error/404error.html
# 外部サーバの別の URL にリダイレクトする
ErrorDocument 500 http://example.com/error.html
 ErrorDocument の設定例

4 番目の別の URL にリダイレクトする方法は、内部サーバのドキュメントを指定する場合であっても、リダイレクトをクライアントに通知する点に注意して下さい。その場合、クライアントはエラーステータスコードを受け取らずに、リダイレクトのステータスコードを受け取ります。ステータスコードを使って URL を有効であるか判断するプログラムに混乱を与える可能性があります。

また、エラーステータスコード 401(Unauthorized:認証失敗)をリダイレクト指定する場合、クライアントは 401 のステータスコードを受け取らないため、パスワードをユーザに入力要求しなければならないことが分かりません。そのため、401 を指定する場合は、3 番目のような内部サーバのドキュメントを参照するようにしなければなりません。


Microsoft Internet Explorer は、エラーメッセージが 512 Byte より小さい場合、エラーメッセージを無視してオリジナルのエラーメッセージを表示します。エラーメッセージが 512 Byte より大きい場合は、そのまま表示します。詳しい情報は Microsoft Knowledge Base の記事 Q294807 にあります。


Google Chrome で 404エラーが発生した場合
Google Chrome で 404エラーが発生した場合
Microsoft Internet Explorer で 404エラーが発生した場合
Microsoft Internet Explorer で 404エラーが発生した場合


本ディレクティブでは、ほとんどのエラーメッセージを上書きすることができますが、不正な形式のリクエストが検出された場合は、Apache オリジナルのエラーメッセージが返されます。この処理は、不正なリクエストによって引き起こされる、セキュリティの問題から守るための措置です。

FileETag ディレクティブ

FileETag ディレクティブは、HTTP レスポンスヘッダに ETag(エンティティタグ)フィールドを作成するために指定します。ETag フィールドは、HTTP におけるキャッシュの有効性を確認するために使われます。例えば、ETag が同じ値である場合、コンテンツに変更がないと判断できるため、レスポンスをすべて返す必要がなくなります。そのため、キャッシュの効率化、および回線帯域の節約ができるようになります。


Apache 1.3.22 以前では、ETag の値は常に inode、ファイルサイズ、最終更新時刻から作成されていましたが、本ディレクティブによって以下の 5 つから選択できるようになりました。複数指定する場合は、半角スペースで区切って指定します。デフォルトの設定では FileETag INode MTime Size となっており、HTTP リクエスト・レスポンスの ETag フィールドでは - で連結されています。

  1. INode:ファイルの inode 番号を使います。
  2. MTime:ファイルの最終更新時刻を使います。
  3. Size:ファイルの Byte 数を使います。
  4. All:上記の 3 つをすべて使います。
  5. None:ETag フィールドをレスポンスに付加しません。

また、ETag は +- を上記のキーワードに付けることでディレクトリ毎の設定を変更することができます。例えば、上位ディレクトリで FileETag MTime Size を指定し、下位ディレクトリで FileETag -Size を指定すると、上位ディレクトリから継承した設定から Size が削除され、下位ディレクトリは FileETag MTime の設定になります。


# All は以下と同じです。
FileETag INode MTime Size
 FileETag の設定例

# ETag フィールドが付与されているレスポンス例
% curl -I https://murashun.jp/img/logo.png
HTTP/1.1 200 OK
Last-Modified: Wed, 15 Jul 2015 11:33:13 GMT
ETag: "acf9ef9-7ea-51ae851f07040"  # ETag が付与されている
Content-Length: 22761
 ETag フィールドが付与されているレスポンス例

ETag は、コンテンツが一致するかを決定する方法のひとつです。ブラウザがコンテンツ(例えば logo.png など)の ETag をキャッシュ後、改めて有効性を確認したい場合は、If-None-Match ヘッダを使ってサーバに ETag を送り返します。ETag が一致すると 304 ステータスコードが返され、レスポンスサイズが小さくなります。


# HTTP Request
GET https://murashun.jp/img/logo.png
Host: murashun.jp
If-Modified-Sine: Wed, 15 Jul 2015 11:33:13 GMT
If-None-Match: "acf9ef9-7ea-51ae851f07040"

# HTTP Response
HTTP/1.1 304 Not Modified
 コンテンツに変更がなかった場合のリクエスト/レスポンス

ただし、ETag の問題点として、負荷分散をするために Web サーバが複数台ある場合は、同じ内容のファイルであっても inode がサーバ毎で異なってしまうため、デフォルトの設定では 200 ステータスコードを返す可能性があります。その場合、パフォーマンスが低下し、サーバの負荷が高くなることになります。そのため、Web サーバが複数台ある場合は inode を使わないか、ETag 自体を使わない設定を検討する必要があります。

<Files> ディレクティブ

<Files> ディレクティブは、指定したファイル名にディレクティブを適用させることができます。指定するファイル名は、完全なファイル名、または部分ファイル名や拡張子などでも問題ありません。適用される範囲は、<Files> ディレクティブで囲まれたブロック内となります。


# 画像ファイルに対して ETag ディレクティブを適用する
<Files ~ "\.(gif|jpe?g|png)$">
  FileETag None
</Files>
 <Files> ディレクティブの例

ファイル名には、ワイルドカード文字列を使用することができます。ワイルドカード文字列では ? は一つの文字、* は任意の文字列にマッチします。~ の文字を使うことで正規表現も使用可能です。ただし、本ディレクティブよりも <FilesMatch> ディレクティブを使う方が推奨されています。

<FilesMatch> ディレクティブ

<FilesMatch> ディレクティブは、正規表現で指定したファイル名にディレクティブを適用させることができます。<Files> ディレクティブで正規表現を使う場合と異なり、~ を使用しないことに注意して下さい。


# 画像ファイルに対して ETag ディレクティブを適用する
<FilesMatch "\.(gif|jpe?g|png)$">
  FileETag None
</FilesMatch>
 <FilesMatch> ディレクティブの例

ForceType ディレクティブ

ForceType ディレクティブは、そのディレクトリにあるファイルの MIMEタイプ(Content-Type)を強制的に指定した値で通知します。例えば、gif 画像を格納しているディレクトリがある場合、以下のように指定すると MIMEタイプ(Content-Type) は image/gif で通知されます。もしも、gif 画像以外の拡張子を持つ画像が含まれていても image/gif で通知されます。


# MIMEタイプ(Content-Type) を強制的に image/gif にする例
ForceType image/gif
 ForceType ディレクティブの例

DefaultTypeディレクティブと似ていますが、本ディレクティブは拡張子から MIMEタイプ(Content-Type)が決定できる・できないに関わらず、MIMEタイプ(Content-Type)を上書きする点が異なります。

<IfDefine> ディレクティブ

<IfDefine> ディレクティブは、Apache の起動時に条件を満たした場合にディレクティブを適用させることができます。起動時の条件とは、httpd のコマンドラインにパラメータを"指定する"、または"指定しない"のいずれかの条件を設定できます。パラメータを指定しない条件の場合、! をパラメータ名の前に付与すると、そのパラメータが指定していない場合に処理されます。


# 起動時にパラメータを指定する場合
<IfDefine parameter-name>
  ...
</IfDefine>

# 起動時にパラメータを指定しない場合
<IfDefine !parameter-name>
  ...
</IfDefine>
 <IfDefine> ディレクティブの例

上記の parameter-name に起動時のパラメータを指定します。例えば、下記の例では、起動時に "maintenance" というパラメータ名を付けることで、常にメンテナンスページにリダイレクトする処理が有効になる例になります。


# "maintenance" パラメータ付きで起動した場合、メンテナンスページにリダイレクトする例
<IfDefine maintenance>
  RewriteEngine On
  RewriteRule ^(.*)$ https://murashun.jp/maintenance.html [L]
</IfDefine>
 <IfDefine> ディレクティブの例

本ディレクティブの設定は、httpd サービスをコマンドラインオプション [-D name] を付与して起動することで有効になります。ただし、レンタルサーバでは利用者に再起動権限がないため、あまり有用ではありません。


# コマンドラインオプション [-D name] で起動する
[root@ ~]# service httpd -D maintenance
httpdを停止中:                       [ OK ] 
httpdを起動中:                       [ OK ] 
[root@ ~]# 
 パラメータ付きで起動する例

<IfModule> ディレクティブ

<IfModule> ディレクティブは、モジュールが存在する、または存在しない場合に処理されるディレクティブを指定できます。モジュールが存在しない条件の場合、! をモジュールのファイル名の前に付与すると、そのモジュールが存在しない場合に処理されます。また、指定する名前はモジュールのファイル名(module-file)の他に、モジュール識別子(module-identifier)も指定できます。例えば、mod_rewrite.c はファイル名、rewrite_module は識別子です。ただし、モジュール識別子は Apache 2.1 以降で使用可能です。


# モジュールが存在する場合
<IfModule module-file|module-identifier>
  ...
</IfModule>

# モジュールが存在しない場合
<IfModule !module-file|module-identifier>
  ...
</IfModule>
 <IfDefine> ディレクティブの例

本ディレクティブでは、モジュールのテストや、1 つの設定ファイルを様々な環境で使いまわすために使用されます。そのため、通常は本ディレクティブを使用しなくても問題ありません。

<Limit> ディレクティブ

<Limit> ディレクティブは、指定した HTTP メソッド(GET や POST など)に処理されるディレクティブを指定できます。HTTP メソッドは、大文字小文字を区別するため、GET と get は異なるメソッドであると判定されます。ただし、アクセス制御は、すべての HTTP メソッドに対して処理を行うことが望ましい挙動です。 そのため、通常はアクセス制御に関するディレクティブを、本ディレクティブ内に設定するべきではありません。

HTTP/1.0 HTTP/1.1 のメソッド一覧
メソッドHTTP/1.0HTTP/1.1説明
GETサーバに対してファイルの取得を要求するメソッドです。また、サーバに情報を伝えるために URL に ? を付けて "パラメータ名=値" として送信することもできます。
HEADヘッダのみの情報を要求するメソッドです。
POST入力フォームなどのクライアントからデータを送信するメソッドです。
PUTファイルをサーバにアップロードするメソッドです。
DELETE指定したファイルを削除することをサーバに要求するメソッドです。
CONNECT×プロキシサーバを経由して SSL 通信などを行うメソッドです。
OPTIONS×サーバがサポートしているメソッドを調べるためのメソッドです。
TRACE×HTTP リクエストをトレースするためのメソッドです。クライアントが送信したリクエストメッセージをそのまま返します。
LINK×指定した URL とリソース間にリンク関係を結びます。
UNLINK×指定した URL とリソース間のリンク関係を解除します。

 (-:必須、○:サポート、×:未サポート)

本ディレクティブでは上記のメソッドが指定できます。複数のメソッドを指定する場合は、半角スペースで区切って指定します。指定されなかったメソッドは、アクセス制御されません。


# POST、PUT、DELETE に対してアクセス制御を行う例
<Limit POST PUT DELETE>
  Require valid-user
</Limit>
 <Limit> ディレクティブの例

本ディレクティブのアンチパターンとして、以下のような書き方があります。


# GET に対してアクセス制御を行う例
<Limit GET>
  Require valid-user
</Limit>
 <Limit> ディレクティブのアンチパターン

上記の例では、GET メソッドでリクエストされた場合のみアクセス制限を行っています。しかし、Apache 2 では通常のドキュメントに対して POST メソッドでアクセスしても、GET メソッドと同じようにコンテンツを返します。以下は、Telnet を使用して POST メソッドでアクセスした場合のログです。


# telnet を使用して murashun.jp にアクセスする
% telnet murashun.jp 80                                                                                                            

Trying 49.212.243.33...
Connected to murashun.jp.
Escape character is '^]'.

# POST メソッドでアクセスする
POST / HTTP/1.1
Host: murashun.jp
Content-Length: 0

# HTTP ステータスコード 200 OK が返ってきてしまう
HTTP/1.1 200 OK
・・・(中略)・・・

%
 <Limit> ディレクティブのアンチパターン

上記のように、POST メソッドでもコンテンツを取得できるため、本ディレクティブは特別な事情がない限りは使用は避けた方が無難です。どうしても使用したい場合は、下記の <LimitExcept> ディレクティブも検討して下さい。

<LimitExcept> ディレクティブ

<LimitExcept> ディレクティブは、指定した HTTP メソッド(GET や POST など)以外に処理されるディレクティブを指定できます。つまり、<Limit> ディレクティブとは逆に、指定されなかった HTTP メソッドに対して処理を行います。指定できる HTTP メソッド一覧は、<Limit> ディレクティブを参照して下さい。


# GET、POST 以外に対してアクセス制御を行う例
<LimitExcept GET POST>
  Require valid-user
</LimitExcept>
 <LimitExcept> ディレクティブの例

LimitRequestBody ディレクティブ

LimitRequestBody ディレクティブは、HTTP リクエストのボディ部に許容される Byte 数を指定できます。指定できる範囲は 0 (無制限) ~ 2147483647 (2GB) までになります。デフォルト値は、0 (無制限) となります。指定された値を超えた場合、サーバは HTTP リクエストを処理せずにエラーを返します。通常の HTTP リクエストのボディ部のサイズは、リソースの種類やメソッドによって大きく異なります。例えば、ファイルアップロードできるサイズを 100 KB に制限する場合は、以下のように指定します。


# 100 KB = 1024 Byte * 100
LimitRequestBody 102400
 LimitRequestBody ディレクティブの例

本ディレクティブは、クライアントからの異常なリクエストを制御できるようにし、何らかのサービス拒否攻撃(DoS 攻撃など)を避けるのに有効です。ただし、ファイルアップロードで使われる PUT メソッドの実装などでは、少なくとも受け入れ可能なサイズ以上にする必要があります。

LimitXMLRequestBody ディレクティブ

LimitXMLRequestBody ディレクティブは、XML 形式の HTTP リクエストのボディ部に許容される Byte 数を指定できます。基本的には、前述した LimitRequestBody ディレクティブと同様になります。0 (無制限) を指定することで、チェックを無効化できます。デフォルト値は、1000000 (約 1 MB) となります。


# LimitXMLRequestBody のチェックを無効化
LimitXMLRequestBody 0
 LimitXMLRequestBody ディレクティブの例

Options ディレクティブ

Options ディレクティブは、ディレクトリに対してどの機能が使用可能かを制御します。複数の機能を指定する場合は、半角スペースで区切って指定します。ただし、さくらインターネットのレンタルサーバでは、本ディレクティブは使用できません。

Options ディレクティブに指定可能な値
説明
AllMultiViews を除いた全ての機能が有効となります。この値がデフォルト値となります。
ExecCGICGI スクリプトの実行を可能にします。
FollowSymLinksシンボリックリンクを有効にします。
IncludesSSI の実行を可能にします。
IncludesNOEXECSSI は有効になりますが、#exec cmd と #exec cgi は無効になります。
IndexesDirectoryIndex ディレクティブで指定したファイル (例えば、index.html) がなければ、ディレクトリ一覧を表示することを許可します。
MultiViewsリソースが複数の表現 (例えば、日本語や英語など) で利用できる場合、適切な言語や MIMEタイプ(Content-Type) を優先的に要求するコンテンツネゴシエーションを許可します。
Noneすべてのオプションを無効にします。
SymLinksIfOwnerMatchシンボリック先のファイル、またはディレクトリが、ファイル所有者と同じ権限である場合、シンボリックリンクを許可します。

また、+ や - を上記のキーワードに付けることでディレクトリ毎の設定を変更することができます。例えば、上位ディレクトリで Options ExecCGI Includes を指定し、下位ディレクトリで Options -Includes を指定すると、上位ディレクトリから継承した設定から Includes が削除され、下位ディレクトリは Options ExecCGI の設定になります。ただし、+ や - を付けたキーワードと、付けていないキーワードを同時に指定する記述は誤りで、予期しない結果になる可能性があります。


# ExecCGI と Includes のみ許可する
Options ExecCGI Includes
 Options ディレクティブの例

Require ディレクティブ

Require ディレクティブは、認証されたユーザがリソースに対してアクセスできるかを制御します。

Require ディレクティブに指定可能な値
説明
Require user
userid [userid] ...
指定されたユーザのみ、ディレクトリへのアクセスを許可します。パスワードファイルに登録されているユーザで、指定した userid のみ認証を行い、その他は拒否します。
Require group
group-name [group-name] ...
指定されたグループに属するユーザのみ、ディレクトリへのアクセスを許可します。パスワードファイルに登録されているユーザで、指定した group-name に属している場合に認証を行い、その他は拒否します。グループは AuthGroupFile で定義をしておく必要があります。
Require valid-userすべての認証されたユーザに、ディレクトリへのアクセスを許可します。

# Require の設定例(他のディレクティブとセット)
AuthType Basic
AuthName "Top Secret"
AuthUserFile "/home/murashun/passwords"
# 認証されたすべてユーザに、ディレクトリへのアクセスを許可します。
Require valid-user
 AuthType の設定例

本ディレクティブは単体では利用できません。 利用するには、AuthName ディレクティブ、AuthType ディレクティブ、AuthUserFile や AuthGroupFile のディレクティブと一緒に利用する必要があります。また、本ディレクティブが <Limit> ディレクティブ内に含まれる場合は、指定している HTTP メソッドに対して認証を行います。<Limit> ディレクティブ内に含まれない場合は、すべての HTTP メソッドに対して認証を行います。

RLimitCPU ディレクティブ

RLimitCPU ディレクティブとは、HTTP リクエストを受け付けた Apache の子プロセスである httpd から fork されたプロセスの CPU 占有時間を制限します。


本ディレクティブのパラメータは 1 つ、または 2 つ指定することができます。1 番目のパラメータは全プロセスに対するリソースのソフトリミットを整数秒、または OS の最大値である max で指定します。2 番目のパラメータは最大のハードリミットを設定します。このパラメータは省略可能です。ただし、最大のハードリミットを上げるためには、特権を持つ root で実行、または起動する必要があります。


# プロセスの CPU 占有時間を 10 秒に設定
RLimitCPU 10
 RLimitCPU の設定例

カーネルはプロセスにリソースリミットを設けています。リソースリミットは、プロセスが使用可能なカーネルリソースの上限値です。上限値は強制的なもので、上限値を超えた場合はプロセスを kill します。また、リソースリミットには、ソフトリミット (soft limit) とハードリミット (hard limit) の 2 種類の上限値があります。ソフトリミットは、0 ~ ハードリミットを超えない範囲で変更が可能です。ハードリミットは、ソフトリミットの上限値のことで、特権を持つプロセス以外は、上限値を下げる変更しか許されていません。


また、RLimit から始まる ディレクティブは、httpd から fork された CGI スクリプト と SSI exec コマンドで使われるリソースを制御します。そのため、mod_perl や mod_php を使用した スクリプトは、この設定が無効であることに注意しましょう。

RLimitMEM ディレクティブ

RLimitMEM ディレクティブとは、HTTP リクエストを受け付けた Apache の子プロセスである httpd から fork されたプロセスの メモリ消費量を制限します。


本ディレクティブのパラメータは 1 つ、または 2 つ指定することができます。1 番目のパラメータは全プロセスに対するリソースのソフトリミットを Byte 数、または OS の最大値である max で指定します。2 番目のパラメータは最大のハードリミットを設定します。このパラメータは省略可能です。ただし、最大のハードリミットを上げるためには、特権を持つ root で実行、または起動する必要があります。


# プロセスの メモリ消費量を 10 MB に設定
RLimitMEM 10485760
 RLimitMEM の設定例

リソースリミットに関する詳細は、前述した RLimitCPU を参照して下さい。

RLimitNPROC ディレクティブ

RLimitNPROC ディレクティブとは、HTTP リクエストを受け付けた Apache の子プロセスである httpd から fork されたプロセス数を制限します。


本ディレクティブのパラメータは 1 つ、または 2 つ指定することができます。1 番目のパラメータは全プロセスに対するリソースのソフトリミットを整数、または OS の最大値である max で指定します。2 番目のパラメータは最大のハードリミットを設定します。このパラメータは省略可能です。ただし、最大のハードリミットを上げるためには、特権を持つ root で実行、または起動する必要があります。


# プロセスの数を 10 プロセスに設定
RLimitNPROC 10
 RLimitNPROC の設定例

リソースリミットに関する詳細は、前述した RLimitCPU を参照して下さい。

Satisfy ディレクティブ

Satisfy ディレクティブは、Allow ディレクティブ(ホストを通過するための制限)と Require ディレクティブ(ユーザ名とパスワード要求における制限)の両方が使われているときのアクセスポリシーを設定します。デフォルトの設定値は All になります。

Satisfy ディレクティブに指定可能な値
説明
Allクライアントはホストの制限を満たし、かつ正しいユーザ名とパスワードを入力することを要求します。
Anyクライアントはホストの制限を満たす、または正しいユーザ名とパスワードの入力をすることを要求します。

例えば、内部ネットワーク上の利用者には、あるWebページについて無制限のアクセスを許可するが、外部ネットワークの利用者には、パスワードを要求するようにするためには、以下のような設定となります。


# Satisfy の設定例
Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any
 Satisfy の設定例

Apache 2.0.51 からは <Limit> と <LimitExcept> ディレクティブを使用することで、本ディレクティブが適用される HTTP メソッドを制限することが可能になりました。


ScriptInterpreterSource ディレクティブ

ScriptInterpreterSource ディレクティブは、Apache が CGI スクリプトを実行するためのインタープリタをどのように探し出すかを指定できます。デフォルトの設定は Script となっており、これはスクリプトファイルの shebang 行 (最初の行で #! から始まるもの) に指されているパスを使用します。Win32 での例は以下のようになります。


#!C:/Perl/bin/perl.exe
...
 Win32 におけるスクリプトファイルの shebang 行の例

もしも環境変数の PATH に perl のパスが設定している場合は、以下のようになります。


#!perl
...
 Win32 におけるスクリプトファイルの shebang 行の例

ScriptInterpreterSource ディレクティブに指定可能な値
説明
Scriptスクリプトファイルの shebang 行に指されているパスを使用します。
Registryスクリプトファイルの拡張子 (例えば、.pl) をキーとして、Windows のレジストリツリー HKEY_CLASSES_ROOT を検索します。レジストリのサブキーは Shell\ExecCGI\Command、または Shell\Open\Command がスクリプトファイルを開くために使われます。レジストリキーが見つからない場合、Script の設定値になります。
Registry-StrictApache 2.0 以降で使用可能です。Registry と同様ですが、レジストリのサブキーは Shell\ExecCGI\Command のみ使われます。ExecCGI キーは手動で設定する必要があるキーで、一般的なキーではありません。そのため、偶発的なプログラムの誤動作を防ぐことができます。

ただし、本ディレクティブは、Win32 のみ互換性があるため、一般的に UNIX 系にインストールされている Apache では使用できません。

ServerSignature ディレクティブ

ServerSignature ディレクティブは、サーバが生成するドキュメントの最下行に付与するフッターの設定を行います。サーバが生成するドキュメントは、エラーメッセージ、mod_proxy における FTP のディレクトリリスト、mod_info の出力などです。デフォルトの設定値は Off になります。以下の例は、ServerSignature の設定が OffOnEMail の例です。


ServerSignature Off の場合
ServerSignature Off の場合
ServerSignature On の場合
ServerSignature On の場合
ServerSignature EMail の場合
ServerSignature EMail の場合


本ディレクティブの目的は、プロキシサーバーを複数台経由している場合に、ユーザがどのサーバがエラーメッセージを返したのか知る手段がほとんど無いためです。また、Apache 2.0.44 以降では、ServerSignature ディレクティブにより表示される情報も制御します。


# ServerSignature の設定例
ServerSignature On
 ServerSignature の設定例

ServerSignature ディレクティブに指定可能な値
説明
OffServerName ディレクティブで指定したフッター行の出力しません。
OnServerName ディレクティブで指定したフッター行を出力します。
EMailServerName ディレクティブで指定したフッター行を出力し、ServerAdmin ディレクティブで指定されたメールアドレスに "mailto:" が追加されます。さくらインターネットのレンタルサーバーでは support@sakura.ad.jp となります。

SetHandler ディレクティブ

SetHandler ディレクティブは、ディレクトリにあるすべてのファイルを強制的に handler-name で指定されたハンドラで扱います。ハンドラとは、ファイルが呼ばれたときに実行される動作の Apache における内部表現です。例えば、ディレクトリ全体が CGI スクリプトファイルである場合、SetHandler ディレクティブで cgi-script を指定すると、拡張子をつけなくても CGI スクリプトと認識されます。


# SetHandler の設定例
SetHandler cgi-script
 SetHandler の設定例
SetHandler ディレクティブに指定可能な値
説明
handler-nameデフォルトのハンドラを上書きします。指定できる設定値は下表を参考にして下さい。
None上書きされたハンドラの設定を無効化します。

Apache の組み込みハンドラは以下の通りです。これらのハンドラは、設定値と動作が定義されているだけであり、機能させるには適切に設定する必要があります。レンタルサーバーでは、/cgi-bin 配下で CGI スクリプトを動かすルールなどに従えば、特に設定する必要はありません。

Apache のハンドラタイプ
説明
default-handler静的なコンテンツを扱うときにデフォルトで使用されるハンドラです。
send-as-isHTTP ヘッダを含めてファイルをそのまま送ります。
cgi-scriptファイルを CGI スクリプトとして扱います。ただし、Options ディレクティブで ExecCGI を指定する必要があります。
imap-fileイメージマップのルールファイルとして解析します。
server-infoサーバの設定情報を取得します。
server-statusサーバの状態報告を取得します。
type-mapコンテンツネゴシエーションのためのタイプマップとして解析します。

本ディレクティブは、デフォルトのハンドラを上書きするため、例えば、/ で終わる URL をリクエストされたときにディレクトリや index ファルを返すような挙動が行われなくなります。上書きされたハンドラを無効にする場合は、設定値で None を指定することで無効化できます。

SetInputFilter ディレクティブ

SetInputFilter ディレクティブは、クライアントの HTTP リクエストを処理するフィルタを設定します。本ディレクティブは、AddInputFilter ディレクティブを含め、他の場所で定義されているフィルタの設定に追加されます。複数のフィルタを指定するときは、データを処理する順番に ; で区切る必要があります。

SetOutputFilter ディレクティブ

SetOutputFilter ディレクティブは、クライアントの HTTP レスポンスを処理するフィルタを設定します。本ディレクティブは、AddOutputFilter ディレクティブを含め、他の場所で定義されているフィルタの設定に追加されます。複数のフィルタを指定するときは、データを処理する順番に ; で区切る必要があります。

mod_actions

以下は、mod_actions モジュールのディレクティブ一覧です。mod_actions は、MIMEタイプ(Content-Type)やリクエストメソッドに応じて CGI スクリプトを実行する機能を提供します。

Action ディレクティブ

Action ディレクティブは、action-type がリクエストされたときに cgi-script が実行される動作を追加できます。以下は、Action ディレクティブの構文となります。


# Action ディレクティブの構文
Action action-type cgi-script
 Action ディレクティブの構文

action-type には、ハンドラ (SetHandler ディレクティブのハンドラ一覧参照) か、MIMEタイプ(Content-Type) を指定できます。以下の設定例では、MIMEタイプ(Content-Type) が image/gif のファイルへのリクエストは、指定したスクリプト /cgi-bin/images.cgi で処理されます。


# Action ディレクティブの設定例
Action image/gif /cgi-bin/images.cgi
 Action ディレクティブの設定例

また、AddHandler ディレクティブを使用することにより オリジナルのハンドラ名・拡張子に対する処理を定義することもできます。以下の設定例では、AddHandler ディレクティブを使用して、オリジナルのハンドラ名 my-file-type と、オリジナルの拡張子 .xyz に対する処理を定義しています。


# Action ディレクティブの設定例
AddHandler my-file-type .xyz
Action my-file-type /cgi-bin/program.cgi
 Action ディレクティブの設定例

mod_alias

以下は、mod_alias モジュールのディレクティブ一覧です。mod_alias は、URL の操作や制御を行います。mod_rewrite モジュールと似ていますが、mod_alias は、簡単な URL 操作向けに設計されています。

Alias ディレクティブ

Alias ディレクティブは、ドキュメントを DocumentRoot ディレクティブで設定した ディレクトリパス以外の場所に保存することを可能にします。指定した url-pathfile-path、または directory-path を参照します。


# Alias ディレクティブの設定例
Alias URL-path file-path|directory-path
 Alias ディレクティブの設定例

下記の例では、/image ディレクトリへのリクエストに対して、サーバは /ftp/pub/image ディレクトリを返します。


# Alias ディレクティブの設定例
Alias /image /ftp/pub/image
 Alias ディレクティブの設定例

本ディレクティブは、完全なパスセグメントが一致した場合のみ処理されます。そのため、url-path の最後に / を付けた場合、例えば /image//image という URL にエイリアスされません。


また、本ディレクティブと他のディレクティブとの処理の順番に注意して下さい。複数の Alias ディレクティブや、Redirect ディレクティブが同じ設定ファイルの中にある場合は、常に Redirect が先に処理されます。次に Alias が上から順番に適用され、最初にマッチングした設定が優先されます。

Redirect ディレクティブ

Redirect ディレクティブは、クライアントへリクエストした URL とは異なる URL を取得するように外部へのリダイレクトを送ります。リダイレクト元の URL は、/ で始まるパスである必要があります。リダイレクト先の URL は、http: などのスキームで始まる絶対 URL を指定するべきですが、/ で始まるものも使用可能です。その場合は、現在のスキームとホスト名が追加されてリダイレクトされます。


# Redirect ディレクティブの設定例
Redirect /service http://foo.example.com/service
 Redirect ディレクティブの設定例

本ディレクティブは、パスセグメントが完全に一致したものがマッチします。正規表現を使ったより複雑なマッチングを行いたい場合は、RedirectMatch ディレクティブを参照して下さい。


また、本ディレクティブでは、status を与えることで、HTTP ステータスコードを返すことができます。status が指定されていないリダイレクトの場合は、"temporary" (HTTP ステータス 302) になります。

Redirect ディレクティブの Status 引数一覧
説明
permanent恒久的にリダイレクトをするステータス (301) を返します。これはリソースが恒久的に移動したということを意味します。
temp一時的なリダイレクトをするステータス (302) を返します。
seeother"See Other" ステータス (303) を返します。これはリソースが他のもので置き換えられたことを意味します。
gone"Gone" ステータス (410) を返します。これはリソースが恒久的に削除されたことを意味します。このステータスが使用された場合、リダイレクト先の URL は省略されなければなりません。
(ステータスコード)ステータスコードを数値で与えることで他のステータスコードも返すことができます。ステータスコードが 300 ~ 399 までの場合、リダイレクト先 URL は存在していなければいけません。その他のステータスコードの場合は、省略されていなければなりません。

# Redirect ディレクティブの設定例
Redirect permanent /one http://example.com/two
Redirect 303 /three http://example.com/other
 Redirect ディレクティブの設定例

RedirectMatch ディレクティブ

RedirectMatch ディレクティブは、Redirect ディレクティブとほぼ同じですが、正規表現を用いたマッチングを行う点が異なります。以下の例では、すべての GIF ファイルを別サーバの同じ名前の JPEG ファイルに後方参照を利用してリダイレクトしています。


# RedirectMatch ディレクティブの設定例
RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg
 RedirectMatch ディレクティブの設定例

RedirectPermanent ディレクティブ

RedirectPermanent ディレクティブはクライアントに Redirect が永久的なもの (ステータス 301) であることを知らせます。Redirect ディレクティブの permanent ステータス設定と同じです。

RedirectTemp ディレクティブ

RedirectTemp ディレクティブはクライアントに Redirect が一時的なものである (ステータス 302) ことを知らせます。Redirect ディレクティブの temp ステータス設定と同じです。

mod_auth_basic

以下は、mod_auth_basic モジュールのディレクティブ一覧です。mod_auth_basic は、Basic 認証方式を提供します。Digest 認証方式については、mod_auth_digestを参照して下さい。


Basic 認証の注意点として、クライアントからサーバにはパスワードを暗号化せずに送ります。そのため、この方法は特に機密性の高いデータに対しては用いるべきではありません。Digest 認証は Basic 認証より安全ですが、レガシーブラウザは Digest 認証をサポートしていない可能性があります (MSIE 5 など) 。Digest 認証 は HTTP/1.1 からの仕様であるため、HTTP/1.1 をサポートしているブラウザであれば問題ありません。

AuthBasicAuthoritative ディレクティブ

AuthBasicAuthoritative ディレクティブは、認証と承認を、より低いレベルで行うかを設定します。本ディレクティブで明示的に Off を設定すると、与えられた認証ユーザIDに対してユーザIDがない、またはルールがない場合に、より低いレベルのモジュール (modules.c ファイルで定義) に移行するようにできます。ユーザ ID がある、またはルールが指定されている場合は、通常のパスワードとアクセスチェックが適用されて、認証に失敗すると "Authentication Required" 応答が返されます。デフォルトの設定では、On が設定されています。


# AuthBasicAuthoritative ディレクティブの構文
AuthBasicAuthoritative On|Off
 AuthBasicAuthoritative ディレクティブの構文

AuthBasicProvider ディレクティブ

AuthBasicProvider ディレクティブは、ユーザ認証に使用される認証プロバイダを設定します。認証プロバイダとは、認証を行うために照会を行う問い合わせ先です。On を設定すると、デフォルトの認証プロバイダ (プレーンテキストのパスワードファイル) が使用されます。この認証プロバイダは mod_authn_file モジュールで実装されているため、サーバに mod_authn_file モジュールが含まれているかを確認が必要です。プレーンテキストのパスワードファイル以外にも、拡張モジュールを使用することで mdb などを認証プロバイダとして設定することができます。


# AuthBasicProvider ディレクティブの構文
AuthBasicProvider On|Off|provider-name [provider-name] ...
 AuthBasicProvider ディレクティブの構文
# AuthBasicProvider ディレクティブの設定例
AuthType basic
AuthName "private area"
AuthBasicProvider dbm
AuthDBMType SDBM
AuthDBMUserFile /www/etc/dbmpasswd
Require valid-user
 AuthBasicProvider ディレクティブの設定例

mod_authn_default

以下は、mod_authn_default モジュールのディレクティブ一覧です。mod_authn_default mod_auth_basic のような認証モジュールを設定しなかった場合に、本モジュールに切り替わります (フォールバック) 。

AuthDefaultAuthoritative ディレクティブ

AuthDefaultAuthoritative ディレクティブは、認証を次の (modules.c ファイルで定義されている) 低次レベルのモジュールに渡すかを設定できます。設定値で Off を設定すると、低次レベルのモジュールに渡されます。しかし、mod_authn_default 自体がとても低いレベルとして定義されているため、通常はこれよりも低次のモジュールは存在しません。そのため、AuthDefaultAuthoritative はデフォルト値である On のままにしたほうが良いでしょう。

mod_authn_file

以下は、mod_authn_file モジュールのディレクティブ一覧です。mod_authn_file は、mod_auth_basic や mod_auth_digest といった認証フロントエンドに対して、プレーンテキストのパスワードファイル内からユーザを検索することで、ユーザ認証機能を提供します。mod_auth_basic や mod_auth_digest を使用する際には、AuthBasicProvider ディレクティブや AuthDigestPrivider ディレクティブで file と指定することでこのモジュールは起動されます。

AuthUserFile ディレクティブ

AuthUserFile ディレクティブは、認証に使用するユーザとパスワードの一覧が格納されている、テキストファイル名を設定します。file-path はパスワードファイルへのパスを絶対パス、または相対パスで指定します。絶対パスでない場合は、ServerRoot からの相対パスとして扱われます。


# AuthUserFile ディレクティブの構文
AuthUserFile file-path
 AuthUserFile ディレクティブの構文

パスワードファイルの各行には、username:password で記述します。password は平文ではなく、暗号化されたパスワードを設定します。また、同一の username が複数回登録された場合、mod_authn_file は最初に見つかったパスワードを使用して認証します。パスワードファイルを作成、または更新するには、htpasswd コマンドを使用します。


# htpasswd コマンドの構文
htpasswd    [ -c ] [ -m | -d | -s | -p ] passwdfile username
htpasswd -b [ -c ] [ -m | -d | -s | -p ] passwdfile username password
htpasswd -n        [ -m | -d | -s | -p ]            username
htpasswd -nb       [ -m | -d | -s | -p ]            username password
 htpasswd コマンドの構文
htpasswd コマンドのオプション一覧
オプション説明
-bコマンドラインからパスワードを作成します。パスワードがコマンドライン上に見えてしまうため、このオプションは極めて注意して使用して下さい。
-cパスワードファイルを作成します。パスワードファイルがすでにある場合、上書きされます。このオプションは -n オプションと組み合わせることができません。 Apache 2.4.4 では、このオプションを使用することによりパスワードが正しく設定されないバグがあります。 その場合、-b オプションを使用することで回避できます。
-nファイルを更新せずに標準出力に結果を表示します。このオプションは passwdfile の引数が省略されます。このオプションは -c オプションと組み合わせることができません。
-mパスワードに Apache の MD5 アルゴリズムを使用します。このアルゴリズムにより暗号化されたパスワードは、Apache 1.3.9 以降であれば移植可能です。
-dパスワードに crypt() 暗号化を使用します。Windows と TPF 以外のプラットフォームで使用可能です。
-sパスワードに SHA 暗号化を使用します。LDAP ディレクトリ変換フォーマット (ldif) を使用する Netscape サーバの移行を容易にします。
-pプレーンテキストパスワードを使用します。ただし、パスワードが暗号化されないため、次のような警告文が表示されます。"Warning: storing passwords as plain text might just not work on this platform."
passwdfileユーザ名とパスワードが含まれているファイル名です。-c フラグがある場合、ファイルが存在しなければファイルを新規作成し、存在していれば上書きされます。
usernamepasswdfile に作成、または更新するユーザ名です。username が存在しなければエントリを追加し、存在していればパスワードを変更します。
passwordファイルに暗号化されて記録されるプレーンテキストのパスワードです。-b オプションがある場合のみ使用されます。

htpasswd コマンド実行後には終了ステータスが返されます。終了ステータスの確認方法は、パスワードファイルの作成直後に echo $? で確認できます。ステータス値の内容は、以下の通りです。


# パスワードファイルの終了ステータス確認方法
% htpasswd -c /home/murashun/.htpasswd murashun
New password: 
Re-type new password: 
Adding password for user murashun
% echo $?                                                                                                                          
0
% 
 パスワードファイルの終了ステータス確認方法
htpasswd コマンドの終了ステータス一覧
ステータス値説明
0 (true)ユーザ名とパスワードが正しく passwdfile に追加、または更新された。
1ファイルアクセスに問題が発生した。
2コマンドラインに関する文法誤りがあった。
3対話形式でパスワードを入力した際に確認のエントリがマッチしなかった。
4操作が中断された。
5ユーザ名、ファイル名、パスワード、最後に計算されたレコードにおいて値が長すぎる。Windows と MPE プラットフォームで htpasswd で暗号化されたパスワードは最大で 255 文字に制限されます。
6ユーザ名に不正な文字が含まれている。
7有効なパスワードファイルでない。

# htpasswd コマンドの例
htpasswd /usr/local/etc/apache/.htpasswd-users jsmith
 htpasswd コマンドの例

上記の例では、ユーザ jsmith のパスワードを追加、または修正します。パスワードの入力は対話形式となり、ユーザはパスワードの入力を促されます。Windows 上で実行された場合、パスワードは Apache MD5 アルゴリズムを使用して暗号化されます。他のプラットフォームの場合は、crypt() 関数が使用されます。ファイルが存在しない場合、htpasswd はエラーを返す以外には何もしません。


# htpasswd コマンドの例
htpasswd -c /home/doe/public_html/.htpasswd jane
 htpasswd コマンドの例

上記の例では、新しいパスワードファイルを作成し、ユーザ jane のレコードを作成します。パスワードの入力は対話形式となり、ユーザはパスワードの入力を促されます。ファイルが存在しても、入出力ができない場合は変更されず、htpasswd はメッセージを表示してエラーステータスを返します。


# htpasswd コマンドの例
htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve
 htpasswd コマンドの例

上記の例では、MD5 アルゴリズムを使ってコマンドラインからのパスワード (Pwd4Steve) を暗号化し、指定されたファイルに格納します。


htpasswd によって管理されるパスワードファイルは、Web サーバの URI の場所内にあるべきではありません。つまり、ブラウザによって呼び出し可能となるディレクトリに格納するべきではありません。本ディレクティブによって ServerRoot からのパスが指定できるため、公開ディレクトリの外に格納しましょう。

mod_authz_default

以下は、mod_authz_default モジュールのディレクティブ一覧です。mod_authz_default は、 mod_authz_user や mod_authz_groupfile といった承認モジュールを設定しなかった場合に、本モジュールに切り替わります (フォールバック) 。

AuthzDefaultAuthoritative ディレクティブ

AuthzDefaultAuthoritative ディレクティブは、認証を次の (modules.c ファイルで定義されている) 低次レベルのモジュールに渡すかを設定できます。設定値で Off を設定すると、低次レベルのモジュールに渡されます。しかし、mod_authz_default 自体がとても低いレベルとして定義されているため、通常はこれよりも低次のモジュールは存在しません。そのため、AuthzDefaultAuthoritative はデフォルト値である On のままにしたほうが良いでしょう。

mod_authz_groupfile

以下は、mod_authz_groupfile モジュールのディレクティブ一覧です。mod_authz_groupfile は、認証されたユーザがグループのメンバーか否かによって Web サイトの一部へのアクセスを許可するか拒否するかの承認機能を提供します。

AuthGroupFile ディレクティブ

AuthGroupFile ディレクティブは、証認に使用するユーザグループの一覧が格納されている、テキストファイルの名前を設定します。file-path はグループファイルへのパスを絶対パス、または相対パスで指定します。絶対パスでない場合は、ServerRoot からの相対パスとして扱われます。


# AuthGroupFile ディレクティブの構文
AuthGroupFile file-path
 AuthGroupFile ディレクティブの構文

グループファイルの各行には、groupname:username [username] ... で記述します。


# グループファイルの設定例
mygroup: bob joe anne
 グループファイルの設定例

AuthzGroupFileAuthoritative ディレクティブ

AuthzGroupFileAuthoritative ディレクティブは、承認を次の (modules.c ファイルで定義されている) 低次レベルのモジュールに渡すかを設定できます。設定値で Off を設定すると、userID に対応するグループがない場合に、低次レベルのモジュールに渡されます。

mod_authz_host

以下は、mod_authz_host モジュールのディレクティブ一覧です。mod_authz_host は、クライアントのホスト名や、IP アドレスによるグループ承認の機能を提供します。


Allow ディレクティブと Deny ディレクティブは、どのようなクライアントにアクセスを許可、または拒否するかを指定するために使用されます。一方、 Order ディレクティブは、Allow ディレクティブと Deny ディレクティブが評価される順番を設定します。


アクセス制限を行うディレクティブはすべての HTTP メソッド (GET、PUT、POST など) に適用されます。そして、一般的にはこれが望ましい動作です。しかし、<Limit> セクションの中にアクセス制限を行うディレクティブを書くことで、一部の HTTP メソッドにのみ制限をかけることもできます。

Allow ディレクティブ

Allow ディレクティブは、クライアントのアクセスを許可するサーバの領域を指定できます。本ディレクティブの最初の引数は常に from になります。それに続く引数は 3 つの異なる形式があります。Allow from all が指定されていれば、すべてのホストにアクセスを許可し、アクセス制限は後述する Deny ディレクティブと Order ディレクティブの設定で決まります。以下は 本ディレクティブの構文となります。


# Allow ディレクティブの構文
Allow from all|host|env=env-variable [host|env=env-variable] ...
 Allow ディレクティブの構文

サーバへのアクセスを許可するには、以下のいずれかの形式で host を指定することができます。


# ホスト名の一部
Allow from apache.org
Allow from .net example.edu
 Allow ディレクティブの設定例

上記の例では、ホスト名の一部、または完全なホスト名に一致すれば、アクセスが許可されます。マッチングは、各部分が完全に一致するものだけに適用されます。そのため、上記の例では foo.apache.org にはマッチしますが、fooapache.org にはマッチしません。この設定を行うと、Apache はクライアントの IP アドレスに対して DNS の 2 重逆引きを行います。ホスト名からオリジナルの IP アドレスを順引きし、順引き (IPアドレス) と逆引き (ホスト名) が一致し、ホスト名がマッチした場合にのみ、アクセスが許可されます。


ホスト名を指定する方法では、パフォーマンスに影響を与えることに注意して下さい。Apache の設定では、パフォーマンスを優先するためにデフォルトの設定では DNS の逆引きを行わない設定になっています。しかし、ホスト名を指定することで逆引きの処理が発生します。そのため、リクエスト回数に比例して逆引きの処理が多くなるため、パフォーマンスが劣化します。ただし、HTTP/1.1 に対応されているブラウザであれば keep-alive 機能によって問い合わせ回数は少なくなります。次の IP アドレス指定では、逆引き処理は発生しないため、パフォーマンスに影響を与えません。


# 完全な IP アドレス
Allow from 10.1.2.3
Allow from 192.168.1.104 192.168.1.205

# IP アドレスの一部
Allow from 10.1
Allow from 10 172.20 192.168.2

# IP アドレス / ネットマスク
Allow from 10.1.0.0/255.255.0.0

# IP アドレス / CIDR ブロック
Allow from 10.1.0.0/16

# IP アドレス (IPv6)
Allow from 2001:db8::a00:20ff:fea7:ccea
Allow from 2001:db8::a00:20ff:fea7:ccea/10
 Allow ディレクティブの設定例

上記の例では、完全な IP アドレス、IP アドレスの一部、ネットマスク表現、CIDR ブロック表現、IPv6 表現に一致すれば、アクセスが許可されます。


# 環境変数
SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
Order Deny,Allow
Deny from all
Allow from env=let_me_in
 Allow ディレクティブの設定例

上記の例では、user-agent の文字列が KnockKnock/2.0 で始まるブラウザのみがアクセスを許可され、他のブラウザはアクセスを拒否されます。Allow from env=env-variable が指定されていると、環境変数 env-variable が存在した場合にリクエストはアクセスを許可されます。そのため、クライアントの User-Agent、Referer、他の HTTP リクエストのヘッダなどによりアクセス許可を行うことができます。

Deny ディレクティブ

Deny ディレクティブは、クライアントのアクセスを拒否するサーバの領域を指定できます。その他は、Allow ディレクティブとまったく同じであるため、Allow ディレクティブを参照して下さい。

Order ディレクティブ

Order ディレクティブは、Allow ディレクティブと Deny ディレクティブが評価される順番を制御します。以下は 本ディレクティブの構文となります。


# Order ディレクティブの構文
Order ordering
 Order ディレクティブの構文

上記の構文で ordering に指定できる設定値は以下のいずれかです。

Order ディレクティブの設定値一覧
ステータス値説明
Deny,AllowDeny ディレクティブが Allow ディレクティブの前に評価されます。アクセスはデフォルトで許可されます。Deny ディレクティブで指定した条件にマッチせず、Allow ディレクティブで指定した条件にマッチするクライアントはアクセスを許可されます。
Allow,DenyAllow ディレクティブが Deny ディレクティブの前に評価されます。アクセスはデフォルトで拒否されます。Allow ディレクティブで指定した条件にマッチせず、Deny ディレクティブで指定した条件にマッチするクライアントはアクセスを拒否されます。
Mutual-failureAllow のリストに現れて、Deny のリストに現れないホストのみがアクセスを許可されます。この順番付けは Order Allow,Deny と同じ効果を持ち、その設定の方が好ましいために非推奨となっています

キーワードは , で分割し、間にスペースを含まないように注意しましょう。どの場合でも、Allow と Deny は、すべて評価されるということに注意してください。以下の例では、apache.org ドメインのすべてのホストはアクセスを許可され、他のすべてのホストはアクセスを拒否されます。


# Order ディレクティブの設定例
Order Deny,Allow
Deny from all
Allow from apache.org
 Order ディレクティブの設定例

以下の例では、apache.org ドメインの foo サブドメインであるすべてのホストがアクセスを許可されます。apache.org ドメイン以外のホストはデフォルトの状態がアクセス拒否のため、サーバへのアクセスを拒否されます。


# Order ディレクティブの設定例
Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org
 Order ディレクティブの設定例

上記の例で Order が Deny,Allow にした場合、すべのホストにアクセスが許可されます。これは、設定ファイル中の順番に関わらず、Allow from apache.org が最後に評価され、Deny from foo.apache.org を上書きするためです。apache.org ドメインにないホストも、デフォルトの状態が allow に変化するため、アクセスを許可されます。


また、本ディレクティブの処理順について注意して下さい。例えば、<Location> セクションの Allow ディレクティブや Deny ディレクティブは、Directory セクションや .htaccess ファイルの後に評価されます。そのため、後続で評価されるディレクティブによって、設定が上書きされる場合があります。

mod_authz_user

以下は、mod_authz_user モジュールのディレクティブ一覧です。mod_authz_user は、認証されたユーザに Web サイトの一部へのアクセスを許可するか拒否するかの承認機能を提供します。

AuthzUserAuthoritative ディレクティブ

AuthzUserAuthoritative ディレクティブは、承認を次の (modules.c ファイルで定義されている) 低次レベルのモジュールに渡すかを設定できます。設定値で Off を設定すると、userID に対応するグループがない場合に、低次レベルのモジュールに渡されます。

mod_autoindex

以下は、mod_autoindex モジュールのディレクティブ一覧です。mod_autoindex は、Unix の ls コマンドや、Win32 の dir シェルコマンドに似たディレクトリのインデックスを生成します。


ディレクトリのインデックスは、通常 DirectoryIndex ディレクティブによって設定された index.html などのユーザによって作成されたファイルを表示します。インデックスのファイルがない場合は、サーバによって生成されたインデックスが表示されます。本モジュールは、サーバによって生成されたインデックスの書式を制御します。

AddAlt ディレクティブ

AddAlt ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、アイコンの表示ができない場合の代替テキストを提供します。HTML の img タグで画像が提供できない場合に、alt 属性によって代替テキストが表示される場合と似ています。アイコンが表示できないケースとしては、画像の読み込みに失敗した場合や、読み込みを無効にしている場合などがあります。


以下は 本ディレクティブの構文となります。代替テキストは string に任意の文字列を設定します。文字列に空白がある場合は、' または " で囲む必要があります。file は代替テキストを提供する完全なファイル名、ファイル名の一部、ワイルドカード表現、拡張子のいずれかを指定します。複数のファイルを指定する場合は、半角スペースを空けて指定します。


# AddAlt ディレクティブの構文
AddAlt string file [file] ...
 AddAlt ディレクティブの構文

以下の例では、PDF ファイルのアイコンが表示できない場合に "PDF file" と表示する設定例です。


# AddAlt ディレクティブの設定例
AddAlt "PDF file" *.pdf
 AddAlt ディレクティブの設定例

AddAlt ディレクティブの表示例
AddAlt ディレクティブの表示例
AddAlt ディレクティブのソース
AddAlt ディレクティブの表示例

AddAltByEncoding ディレクティブ

AddAltByEncoding ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、アイコンの表示ができない場合、MIME 符号化方法で指定された代替テキストを提供します。MIME 符号化方法とは、例えば x-compress などです。その他は、AddAlt ディレクティブと同じなので、AddAlt ディレクティブを参照して下さい。


# AddAltByEncoding ディレクティブの構文
AddAltByEncoding string MIME-encoding [MIME-encoding] ...
 AddAltByEncoding ディレクティブの構文

# AddAltByEncoding ディレクティブの設定例
AddAltByEncoding gzip x-gzip
 AddAltByEncoding ディレクティブの設定例

AddAltByType ディレクティブ

AddAltByType ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、アイコンの表示ができない場合、MIMEタイプ(Content-Type)で指定された代替テキストを提供します。MIMEタイプ(Content-Type)とは、例えば text/html などです。その他は、AddAlt ディレクティブと同じなので、AddAlt ディレクティブを参照して下さい。


# AddAltByType ディレクティブの構文
AddAltByType string MIME-type [MIME-type] ...
 AddAltByType ディレクティブの構文

# AddAltByType ディレクティブの設定例
AddAltByType 'plain text' text/plain
 AddAltByType ディレクティブの設定例

AddDescription ディレクティブ

AddDescription ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、ファイルに対する説明文を設定できます。


以下は 本ディレクティブの構文となります。ファイルの説明文は string に任意の文字列を設定します。文字列に空白がある場合は、' または " で囲む必要があります。file は説明するファイルの完全なファイル名、ファイル名の一部、ワイルドカード表現、拡張子のいずれかを指定します。複数のファイルを指定する場合は、半角スペースを空けて指定します。


# AddIcon  ディレクティブの構文
AddDescription string file [file] ...
 AddDescription ディレクティブの構文

デフォルトの説明領域は 23 Byte の幅となります。しかし、IndexOptions ディレクティブのアイコン、ファイルサイズ、最終更新日時を消すオプションを使用することにより、より広い幅が得られます。

  • SuppressIcon オプション (アイコンを消すオプション) で 6 Byte 追加
  • SuppressSize オプション (ファイルサイズを消すオプション) で 7 Byte 追加
  • SuppressLastModified オプション (最終更新日時を消すオプション) で 19 Byte 追加

そのため、説明文の最大幅は 55 Byte になります。最大幅の Byte 数を超えると、説明文の末尾に > が付与され、以降の文字列は省略されます。


# AddDescription  ディレクティブの設定例
AddDescription "The planet Mars" /web/pics/mars.gif
 AddDescription ディレクティブの設定例

AddIcon ディレクティブ

AddIcon ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、表示するアイコンを設定できます。以下の構文の icon には、表示するアイコンのパスを相対 URL か、他の書式 (alttext, url) で指定します。name には、ディレクトリを示す ^^DIRECTORY^^、空白行を示す ^^BLANKICON^^、完全なファイル名、ファイル名の一部、ワイルドカード表現、拡張子のいずれかを指定します。


# AddIcon  ディレクティブの構文
AddIcon icon name [name] ...
 AddIcon ディレクティブの構文

# AddIcon ディレクティブの設定例
AddIcon (IMG,/icons/image.gif) .gif .jpg .png
AddIcon /icons/dir.gif ^^DIRECTORY^^
AddIcon /icons/backup.gif *
 AddIcon ディレクティブの設定例

ただし、可能であれば本ディレクティブよりも、AddIconByType ディレクティブを優先的に使うべきです。AddIconByType ディレクティブは MIMEタイプ(Content-Type)毎に表示するアイコンを設定できるため、より本質的であると考えます。

AddIconByEncoding ディレクティブ

AddIconByEncoding ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、表示するアイコンを MIME 符号化方法で設定できます。以下の構文の icon には、表示するアイコンのパスを相対 URL か、他の書式 (alttext, url) で指定します。MIME-encoding には、MIME 符号化方法に該当する文字列、またはワイルドカード表現が使用できます。


# AddIconByEncoding  ディレクティブの構文
AddIconByEncoding icon MIME-encoding [MIME-encoding] ...
 AddIconByEncoding ディレクティブの構文

# AddIconByEncoding ディレクティブの設定例
AddIconByEncoding /icons/compress.xbm x-compress
 AddIconByEncoding ディレクティブの設定例

AddIconByType ディレクティブ

AddIconByType ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、表示するアイコンを MIME タイプ(Content-Type)で設定できます。以下の構文の icon には、表示するアイコンのパスを相対 URL か、他の書式 (alttext, url) で指定します。MIME-type には、リクエストされた MIME タイプ(Content-Type)に該当する文字列、またはワイルドカード表現が使用できます。


# AddIconByType ディレクティブの構文
AddIconByType icon MIME-type [MIME-type] ...
 AddIconByType ディレクティブの構文

# AddIconByType ディレクティブの設定例
AddIconByType (IMG,/icons/image.gif) image/*
 AddIconByType ディレクティブの設定例

DefaultIcon ディレクティブ

DefaultIcon ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、表示するアイコンがない場合にデフォルトアイコンを設定できます。以下の構文の url-path には、アイコンへの相対パスを設定します。


# DefaultIcon ディレクティブの構文
DefaultIcon url-path
 DefaultIcon ディレクティブの構文

# DefaultIcon ディレクティブの設定例
DefaultIcon /icon/unknown.gif
 DefaultIcon ディレクティブの設定例

HeaderName ディレクティブ

HeaderName ディレクティブは、インデックスファイルの body タグの先頭に挿入するファイルの名前を設定できます。以下の構文の filename には、取り込むファイル名をインデックスファイルが表示されるディレクトリからの相対パスで指定します。/ から始まる場合は、DocumentRoot からの相対パスとなります


# HeaderName ディレクティブの構文
HeaderName filename
 HeaderName ディレクティブの構文

# HeaderName ディレクティブの設定例
HeaderName HEADER.html
 HeaderName ディレクティブの設定例

HeaderName ディレクティブを指定しない場合
HeaderName ディレクティブを指定しない場合
HeaderName ディレクティブを指定した場合
HeaderName ディレクティブを指定した場合


上記の例では、左の画像が HeaderName ディレクティブを利用していないデフォルトの状態です。右の画像が HeaderName ディレクティブを利用して sample.html から文字列を読み込んだ状態です。

IndexHeadInsert ディレクティブ

IndexHeadInsert ディレクティブは、インデックスファイルの head タグ内に挿入する文字列を設定できます。半角スペースを含む場合は、" で囲む必要があります。その際、タグ内で使われる "\ でエスケープが必要な点に注意して下さい。本ディレクティブは、Apache 2.2.11 以降で使用可能です。


# IndexHeadInsert ディレクティブの設定例
IndexHeadInsert "<link rel=\"sitemap\" href=\"/sitemap.html\">"
 IndexHeadInsert ディレクティブの設定例

IndexIgnore ディレクティブ

IndexIgnore ディレクティブは、ディレクトリの一覧を表示させる前に、非表示にするファイルを設定します。以下の構文の file には、完全なファイル名、ワイルドカード表現が使えます。


# IndexIgnore ディレクティブの構文
IndexIgnore file [file] ...
 IndexIgnore ディレクティブの構文

# IndexIgnore ディレクティブの設定例
IndexIgnore README .htaccess *.bak *~
 IndexIgnore ディレクティブの設定例

本ディレクティブが複数設定されている場合は、非表示にするリストに追加が行われ、置換は行われません。また、デフォルト値として、カレントディレクトリを表す . が含まれています。

IndexOptions ディレクティブ

IndexOptions ディレクティブには、ディレクトリインデックスの挙動を設定できます。


# IndexOptions ディレクティブの設定例
IndexOptions FancyIndexing
 IndexOptions ディレクティブの設定例

IndexOptions ディレクティブの設定値一覧
説明
DescriptionWidth=[n|*]説明文の幅を文字数で指定できます。
設定しない場合は、説明文の幅を自動調節します。
DescriptionWidth=n で、説明文の幅を n バイトに固定します。
DescriptionWidth=* で、説明文の幅を最長の長さまで伸ばします。
FancyIndexing飾り付きインデックスをオンにします。
FoldersFirst
(Apache 2.0.23 以降)
サブディレクトリがファイルよりも前に表示されます。このオプションは、FancyIndexing が有効である必要があります。
HTMLTable
(Apache 2.0.23 以降)
テーブルを使った単純な表を作り、ディレクトリ一覧を表現します。このオプションは、FancyIndexing が有効である必要があります。
IconsAreLinksFancyIndexing において、 アイコンもファイル名へのリンクの一部にします。このオプションは、FancyIndexing が有効である必要があります。
IconHeight[=pixels]アイコンの img タグに height 属性を指定できます。設定しない場合は、Apache で提供されているアイコンの標準の高さがデフォルトになります。
IconWidth[=pixels]アイコンの img タグに width 属性を指定できます。設定しない場合は、Apache で提供されているアイコンの標準の幅がデフォルトになります。
IgnoreCaseファイル名の大文字と小文字を区別せずにソートを行います。
IgnoreClientクライアントからのすべてのクエリー変数を無視します。ソートなどはクエリー変数を含むため、ファイルのソートもできなくなります。
NameWidth=[n|*]ファイル名の幅を文字数で指定できます。
設定しない場合は、ファイル名の幅を自動調節します。
NameWidth=n で、ファイル名の幅を n バイトに固定します。
NameWidth=* で、ファイル名の幅を最長の長さまで伸ばします。
ScanHTMLTitlesHTML ドキュメントから title タグ内の文字列を取り出しを許可します。もしも、AddDescription で説明文が無い場合、httpd は title タグの値を読むためにドキュメントを読み始めます。このオプションは、FancyIndexing が有効である必要があります。
ShowForbiddenサブリクエストの結果が HTTP_UNAUTHORIZED (HTTP 401エラー:許可なし) や、HTTP_FORBIDDEN (HTTP 403エラー:アクセス拒否) のファイルも一覧に表示します。
SuppressColumnSortingFancyIndexing で表示されている先頭行のソートを行うためのリンクをしなくなります。
SuppressDescriptionFancyIndexing におけるファイルの説明文の表示を消去します。
SuppressHTMLPreambleHeaderName ディレクティブで指定したファイルを body タグからではなく head タグから表示を行います。
SuppressIcon
(Apache 2.0.23 以降)
FancyIndexing におけるファイルのアイコンの表示を消去します。
SuppressLastModifiedFancyIndexing におけるファイルの最終更新日時の表示を消去します。
SuppressRules
(Apache 2.0.23 以降)
ディレクトリ一覧において水平区切り線 (hr タグ) を消去します。
SuppressSizeFancyIndexing におけるファイルのサイズの表示を消去します。
TrackModified
(Apache 2.0.23 以降)
HTTP ヘッダ中に、 ディレクトリの Last-Modified や ETag を含めます。
VersionSort
(Apache 2.0a3 以降)
バージョン番号を含んだファイルが自然な順番でソートされるようにします。文字列は通常通りソートされ、それ以外の "数" となる部分の文字列は数値で比較されます。
XHTML
(Apache 2.0.49 以降)
HTML 3.2 の代わりに XHTML 1.0 のコードを出力するようになります。

本ディレクティブのオプションは、上位ディレクトリから継承されたオプションを下位ディレクトリで +- を付けることで増減させることができます。下位ディレクトリで +- を付けずにオプション指定をした場合、上位ディレクトリから継承されたオプションはすべて破棄されて、下位ディレクトリで指定したオプションのみ有効になります。

IndexOrderDefault ディレクティブ

IndexOrderDefault ディレクティブは、IndexOptions ディレクティブの FancyIndexing オプションにおいて、標準のファイルの並び方を設定できます。本ディレクティブは、2 つの引数を設定します。1 つ目の引数は、昇順か降順かを指定する引数です。Ascending (昇順)、または Descending (降順) を指定します。2 つ目の引数は、ソートキーを指定する引数です。NameDateSizeDescription のいずれかを指定します。


# IndexOrderDefault ディレクティブの構文
IndexOrderDefault Ascending|Descending Name|Date|Size|Description
 IndexOrderDefault ディレクティブの構文

# IndexOrderDefault ディレクティブの設定例
IndexOrderDefault Ascending Name
 IndexOrderDefault ディレクティブの設定例

IndexStyleSheet ディレクティブ

IndexStyleSheet ディレクティブは、ディレクトリインデックスに使用される CSS を指定できます。


# IndexStyleSheet ディレクティブの構文
IndexStyleSheet "/css/style.css"
 IndexStyleSheet ディレクティブの構文

ReadmeName ディレクティブ

ReadmeName ディレクティブは、インデックスファイルの body の閉じタグの直前に挿入するファイルの名前を設定できます。以下の構文の filename には、取り込むファイル名をインデックスファイルが表示されるディレクトリからの相対パスで指定します。/ から始まる場合は、DocumentRoot からの相対パスとなります


# ReadmeName ディレクティブの構文
HeaderName filename
 ReadmeName ディレクティブの構文

# ReadmeName ディレクティブの設定例
ReadmeName /include/FOOTER.html
 ReadmeName ディレクティブの設定例

ReadmeName ディレクティブを指定しない場合
ReadmeName ディレクティブを指定しない場合
ReadmeName ディレクティブを指定した場合
ReadmeName ディレクティブを指定した場合


mod_env

以下は、mod_env モジュールのディレクティブ一覧です。mod_env は、CGI スクリプトと SSI ページに適用される環境変数を制御することができるようになります。環境変数は httpd プロセスを起動したシェルから渡されます。また、環境変数を設定したり、削除したりすることもできます。

PassEnv ディレクトリ

PassEnv ディレクトリは、httpd プロセスを起動したシェルから渡す環境変数を 1 つ以上指定できます。複数指定する場合は、半角スペースで区切って指定します。指定した環境変数は CGI スクリプトや、SSI ページに渡せます。以下の構文の env-variable には、環境変数が入ります。


# PassEnv ディレクティブの構文
PassEnv env-variable [env-variable] ...
 PassEnv ディレクティブの構文

# PassEnv ディレクティブの設定例
PassEnv LD_LIBRARY_PATH
 PassEnv ディレクティブの設定例

SetEnv ディレクトリ

SetEnv ディレクトリは、環境変数を設定します。設定した環境変数は CGI スクリプトや SSI ページに渡せます。ただし、SetEnv はリクエスト処理順の中でも遅くに実行されます。そのため、SetEnvIf や RewriteCond などからは、本ディレクティブで設定した環境変数を参照することはできません。


# SetEnv ディレクティブの設定例
SetEnv SPECIAL_PATH /foo/bin
 SetEnv ディレクティブの設定例

UnsetEnv ディレクトリ

UnsetEnv ディレクトリは、指定された環境変数を取り除きます。取り除かれた環境変数は、CGI スクリプトや SSI ページに渡しても (none) が表示されます。


# UnsetEnv ディレクティブの設定例
UnsetEnv LD_LIBRARY_PATH
 UnsetEnv ディレクティブの設定例

mod_expires

以下は、mod_expires モジュールのディレクティブ一覧です。mod_expires は、レスポンスヘッダの Expires HTTP ヘッダ と Cache-Control ヘッダの max-age の設定を制御します。例えば、「あるドキュメントは頻繁に更新されるため、再読み込みを行う必要がある」という情報や、「あるドキュメントはあまり更新されないためキャッシュした方が良い」という情報を設定して、クライアントに通知することが可能になります。


これらの情報は、ファイルが作成された時刻、またはクライアントのアクセス時刻のどちらかによって期限切れ (expired) の日時を設定することができます。ドキュメントがキャッシュされた場合は、指定時刻に到達するまでは再読み込みを行わず、キャッシュされたドキュメントを使うことができます。期限切れの日時に到達した場合は、キャッシュにあるコピーは期限切れのため無効になり、新しいドキュメントを再読み込みします。

ExpiresActive ディレクトリ

ExpiresActive ディレクトリは、Expires ヘッダの生成の有効・無効を制御します。以下は 本ディレクティブの構文となります。


# ExpiresActive ディレクティブの構文
ExpiresActive On|Off
 ExpiresActive ディレクティブの構文

本ディレクティブを有効にした場合、Expires ヘッダが有効になります。有効の場合、後述する ExpiresByType ディレクティブと ExpiresDefault ディレクティブ の設定に従いヘッダを追加します


以下は、png ファイルに対してキャッシュが破棄されるまで 1 週間の期限を設けた設定例と、レスポンス例です。期限切れ (expired) の日時が 1 週間後になっていることが分かります。Cache-Control の 604800 は秒単位となります。(60 × 60 × 24 × 7 = 604800)


# ExpiresActive ディレクティブの設定例
ExpiresActive On
ExpiresByType image/png "access plus 1 weeks"
 ExpiresActive ディレクティブの設定例
# png ファイルに 1 週間のキャッシュ期限を設定した例
% curl -I https://murashun.jp/img/logo.png
HTTP/1.1 200 OK
Date: Thu, 03 Sep 2015 00:00:00 GMT
Cache-Control: max-age=604800
Expires: Thu, 10 Sep 2015 00:00:00 GMT
 png ファイルに 1 週間のキャッシュ期限を設定した例

本ディレクティブは Expires と Cache-Control ヘッダの存在を保証するわけではないことに注意してください。条件が満たされていない場合はヘッダは追加されず、結果としてこのディレクティブが指定されていないように振る舞います。

ExpiresByType ディレクトリ

ExpiresByType ディレクトリは、指定された MIME タイプ(Content-Type) のドキュメント (例えば text/html) に対して生成される Expires ヘッダと Cache-Control ヘッダの max-age の値を定義します。以下は 本ディレクティブの構文となります。


# ExpiresByType ディレクティブの構文
ExpiresByType MIME-type <code>seconds
 ExpiresByType ディレクティブの構文

seconds には、期限切れの日時を秒数で設定します。Cache-Control: max-age は期限切れの日時からリクエスト日時を引いたものを秒で表すことで生成されます。


期限切れの基準となる日時は、ファイルの最終更新日時か、ドキュメントへのアクセス日時です。どちらを使うかは <code> によって指定します。<code> には、MA を指定できます。M はファイルの最終更新日時、A はドキュメントへのアクセス日時になります。


# ExpiresActive ディレクティブを有効にする
ExpiresActive On

# gif 画像はアクセス日時から 1 ヶ月間有効にする
ExpiresByType image/gif A2592000

# HTML ドキュメントは最終更新日時から 1 週間有効にする
ExpiresByType text/html M604800
 ExpiresByType ディレクティブの設定例

本ディレクティブは ExpiresActive On が指定されているときのみ有効であることに注意してください。これは、指定された MIME タイプ(Content-Type) に対してのみ ExpiresDefault ディレクティブで 設定された期限切れ期日を上書きします。


また、本ディレクティブと、ExpiresDefault ディレクティブは、"代替期間指定構文" と呼ばれる可読性に優れた構文を使用することができます。以下が、代替期間指定構文です。


# ExpiresDefault ディレクティブの代替期間指定構文
ExpiresDefault "<base> [plus] {<num> <type>}*"

# ExpiresByType ディレクティブの代替期間指定構文
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"
 ExpiresDefault ディレクティブとExpiresByType ディレクティブの代替期間指定構文

<base> は以下のいずれかになります。

  • access
  • now ('access' と等価)
  • modification

plus キーワードは省略可能です。<num> は整数値、<type> は以下のいずれかになります。

  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

例えば、以下の設定例では、どのドキュメントもアクセスの 1 ヶ月後に期限が切れます。


# 1 ヶ月後に期限が切れる設定例
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"
 1 ヶ月後に期限が切れる設定例

期限切れ時刻はいくつか <num><type> を追加することでより細かく制御することができます。


# <num> や <type> を使用した設定例
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"
 <num> や <type> を使用した設定例

ExpiresDefault ディレクトリ

ExpiresDefault ディレクトリは、デフォルトの期限切れ期日の計算アルゴリズムを設定します。ExpiresByType ディレクティブによって タイプ毎に上書きすることができます。本ディレクティブでも、ExpiresByType ディレクティブと同じように "代替期間指定構文" が使用できます。詳細は、ExpiresByType ディレクティブを参照して下さい。以下は 本ディレクティブの構文となります。


# ExpiresDefault ディレクティブの構文
ExpiresDefault MIME-type <code>seconds
 ExpiresDefault ディレクティブの構文

mod_filter

以下は、mod_filter モジュールのディレクティブ一覧です。Apache 2.0 以降では、フィルタチェインと呼ばれる機能が使用でき、入出力データを柔軟に処理できます。更に Apache 2.1 以降では、スマートフィルタと呼ばれる機能が使用でき、動的にフィルタチェインを有効にできます。フィルタは、入力データをプリプロセス (前処理) したり、出力データをポストプロセス (後処理) したりできます。これらの処理は、リクエスト処理のフェーズとは根本的に独立した処理になります。


フィルタの使い方としては、シンプルな方法とダイナミックな方法の 2 つの方法があります。シンプルな方法とダイナミックな方法は組み合わせて使うことができますが、一般的にはどちらかのみを使います。これらを組み合わせて使用すると、予期しない結果になる可能性があるためです。

FilterChain ディレクトリ

FilterChain ディレクトリは、filter-name で宣言したフィルタによる、フィルタチェインを設定します。本ディレクティブでは、任意の数の引数を設定できます。各引数には、動作を制御する頭文字 +=-@! を付けることができます。


# FilterChain ディレクティブの構文
FilterChain [+=-@!]filter-name ...
 FilterChain ディレクティブの構文
FilterChain ディレクティブの引数の頭文字一覧
説明
+filter-namefilter-name をフィルタ・チェインの末尾に追加します。
@filter-namefilter-name をフィルタ・チェインの先頭に追加します。
-filter-namefilter-name をフィルタ・チェインから取り除きます。
=filter-nameフィルタ・チェインを空にし、filter-name を追加します。
!フィルタ・チェインを空にします。
filter-name+filter-name と同じです。

FilterDeclare ディレクトリ

FilterDeclare ディレクトリは、出力フィルタの実行タイミングを指定できます。指定時には、ヘッダ、または環境変数を同時に宣言します。


以下の構文の filter-name には、FilterProvider、FilterChain、FilterProtocol ディレクティブで使うためのフィルタ名を指定します。[type] には、RESOURCE、CONTENT_SET、PROTOCOL、TRANSCODE、CONNECTION、NETWORK のいずれかを指定します。指定しない場合は、RESOURCE がデフォルト値となります。


# FilterDeclare ディレクティブの構文
FilterDeclare filter-name [type]
 FilterDeclare ディレクティブの構文

フィルタのタイプ ([type]) は、ap_filter_type の値をとります。ap_filter_type は util_filter.h に含まれる enum 変数です。フィルタのタイプは、内部で固有の並び順を持ち、フィルタチェインの順序を決定しています。


/**
* Filters have different types/classifications. These are used to group
* and sort the filters to properly sequence their operation.
*
* The types have a particular sort order, which allows us to insert them 
* into the filter chain in a determistic order. Within a particular 
* grouping, the ordering is equivalent to the order of calls 
* to ap_add_*_filter().
*/
typedef enum {
  /** These filters are used to alter the content that is passed through
   *  them. Examples are SSI or PHP. */
  AP_FTYPE_RESOURCE     = 10,
  /** These filters are used to alter the content as a whole, but after all
   *  AP_FTYPE_RESOURCE filters are executed.  These filters should not
   *  change the content-type.  An example is deflate.  */
  AP_FTYPE_CONTENT_SET  = 20,
  /** These filters are used to handle the protocol between server and
   *  client.  Examples are HTTP and POP. */
  AP_FTYPE_PROTOCOL     = 30,
  /** These filters implement transport encodings (e.g., chunking). */
  AP_FTYPE_TRANSCODE    = 40,
  /** These filters will alter the content, but in ways that are
   *  more strongly associated with the connection.  Examples are
   *  splitting an HTTP connection into multiple requests and
   *  buffering HTTP responses across multiple requests.
   *
   *  It is important to note that these types of filters are not
   *  allowed in a sub-request. A sub-request's output can certainly
   *  be filtered by ::AP_FTYPE_RESOURCE filters, but all of the "final
   *  processing" is determined by the main request. */
  AP_FTYPE_CONNECTION  = 50,
  /** These filters don't alter the content.  They are responsible for
   *  sending/receiving data to/from the client. */
  AP_FTYPE_NETWORK     = 60
} ap_filter_type;
 include/util_filter.h

FilterProtocol ディレクトリ

FilterProtocol ディレクトリは、フィルタを実行しないように設定できます。また、フィルタの効果を考慮して HTTP レスポンスヘッダを正しく設定したりするように mod_filter が振る舞うようにします。


# FilterProtocol ディレクティブの構文
FilterProtocol filter-name [provider-name] proto-flags
 FilterProtocol ディレクティブの構文
proto-flags 一覧
説明
change=yesフィルタは、コンテンツ、およびコンテンツの長さの変更を許可します。
変更を許可しない no の設定は Apache 2.4.7 以降で使用可能です。
change=1:1フィルタは、コンテンツの変更を許可しますが、コンテンツの長さの変更は許容しません。
byteranges=noフィルタは、byteranges 上で動作せず、完全な入力を要求します。
proxy=noフィルタは、プロキシコンテンツについて実行しません。
proxy=transformフィルタは、Cache-Control: no-transform ヘッダと互換性のないレスポンスを返します。
cache=noフィルタは、キャッシュが不可能な出力を行います。

FilterProvider ディレクトリ

FilterProvider ディレクトリは、スマートフィルタのプロバイダを登録します。プロバイダは、match の文字列と一致した場合、または dispatch の値が一致したときに呼ばれます。


# FilterProvider ディレクティブの構文
FilterProvider filter-name provider-name [req|resp|env]=dispatch match
 FilterProvider ディレクティブの構文

dispatch は、req= (リクエスト) 、resp= (レスポンス) 、env= (環境変数) を意味するプレフィックスを設定できます。プレフィックスを省略した場合は、デフォルトでレスポンスとなります。


match は、フィルタの dispatch で指定したプレフィックスの設定値に一致する文字列を指定できます。指定できる文字列は、完全一致、部分一致、正規表現、整数、無条件一致のいずれかになります。match の処理順は、最初に先頭文字列が ! (否定) の条件であるかを判定します。次に、否定以外の先頭文字列を判定します。否定以外の先頭文字列として、以下の記号が使用可能です。

proto-flags 一覧
説明
(なし)完全一致
$部分一致
/正規表現 (次の / で区切られます)
=比較対象の整数と等価であるか
<比較対象の整数未満であるか
<=比較対象の整数以下であるか
>比較対象の整数を超えるか
>=比較対象の整数以上であるか
*無条件一致

mod_headers

以下は、mod_headers モジュールのディレクティブの一覧です。mod_headers は、HTTP リクエストのヘッダと、HTTP レスポンスのヘッダを追加、削除、変更することができます。


HTTP ヘッダのカテゴリには、一般ヘッダ、リクエスト (要求) ヘッダ、レスポンス (応答) ヘッダ、要素ヘッダの 4 種類があります。一般ヘッダと要素ヘッダは、リクエストとレスポンスの両方に付きますが、リクエストヘッダはリクエストのみ、レスポンスヘッダはレスポンスのみに付きます。

HTTP ヘッダ一覧
カテゴリREQRESフィールド名一覧
一般ヘッダCache-Control, Connection, Date, Pragma, Trailer, Transfer-Encoding, Upgrade, Via, Warning
要素ヘッダAllow, Content-Encoding, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Type, Expires, Last-Modified
要求ヘッダ×Accept, Accept-Charset, Accept-Encoding, Accept-Language, Authorization, Expect, From, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Max-Forwards, Proxy-Authorization, Range, Referer, TE, User-Agent
応答ヘッダ×Accept-Ranges, Age, ETag, Location, Proxy-Authenticate, Retry-After, Server, Vary, WWW-Authenticate
一般ヘッダのフィールド名一覧
フィールド名HTTP/1.0HTTP/1.1説明
Cache-Control×キャッシュのコントロールに必要な指示や情報を表します。HTTP/1.0 では Pragma: no-cache が使用されます。
Connection※2接続の持続性の情報を表します。1 回の TCP 接続で複数のコンテンツを要求することで通信パフォーマンスが向上します。Keep-Alive の場合、接続が持続します。Close の場合、レスポンス後の接続は解除されます。
DateHTTP メッセージを生成した日時を表します。RFC822形式、RFC850形式、ANSI C形式などを受け入れる必要があります。曜日と秒数は省略可能です。日付は 0 パディングでも問題ありません。年は 2 桁でも 4 桁でも問題ありませんが、4桁が推奨されています。時間帯は GMT (グリニッジ標準時) が一般的です。
Pragma関連するクライアント、プロキシ、サーバに様々な特殊情報を認識させることができます。例えば、no-cache を指定した場合は、無条件で再読み込みを行うなどです。
Trailer×送信するデータを任意の長さに分割し、全体のサイズを記述したヘッダを付加するエンコード方式 (チャンク方式) における、ヘッダの一覧を表します。
Transfer-Encoding×転送に使用されるエンコード方式を表します。HTTP/1.1 ではチャンク方式 (chunked) のみ定義されています。
Upgrade×HTTP の他に使用を推奨するプロトコルを表します。現在では HTTP/1.1 が最新ですが、将来的に HTTP/2.0 などがこのフィールド名で指定される可能性があります。
Via×メッセージがどのプロキシを経由して転送されたかを表します。このフィールドは、ネットワーク上でリクエストがループしていないかを検知するために使われます。
Warning×レスポンスに関する追加情報を表します。HTTP/1.1 では 7 つの Warning コードとメッセージが定義されています。
110 Response is Stale
111 Revalidation Failed
112 Disconnected Operation
113 Heuristic Expiration
199 Miscellaneous Warning
214 Transformation Applied
299 Miscellaneous Persistent Warning
要素ヘッダのフィールド名一覧
フィールド名HTTP/1.0HTTP/1.1説明
Allow要求する URL で指定したリソースに対して使用可能なメソッドの一覧を表します。サーバが受け入れられないメソッドを受けると、ステータスコード 405 Method Not Allowed レスポンスと、受け入れ可能なメソッドの一覧を Allowヘッダ で返します。
Content-Encodingコンテンツのエンコード方式 (Content Coding 方式) を表します。HTTP/1.1 では gzipcompressdeflateidentity (エンコードなし) が定義されています。
Content-Language×コンテンツの使用言語コードを表します。
Content-Lengthコンテンツの長さを Byte 単位で表します。Transfer-Encoding フィールドでチャンク方式 (chunked) が指定されている場合、このフィールドは使用されません。
Content-Location×コンテンツに対応する URI を表します。Location フィールドとは異なり、このフィールドはメッセージボディで返されるリソースの URI を表します。
Content-MD5×コンテンツに関するチェックデータ (128 bit の MD5 Digest を BASE64 エンコードしたもの) を表します。コンテンツが通信途中に改変されていないかを検知するために用いられます。ただし、改変されたメッセージで MD5 を求めた場合は検知できません。
Content-Range×コンテンツの一部分だけをリクエストするレンジリクエストに対するレスポンスを表します。例えば、コンテンツ全体が 1000 Byte あり、その中の 0 Byte ~ 500 Byte の部分だけを送信していることを伝えます。
Content-TypeコンテンツのMIME タイプ(Content-Type)を表します。
Expiresコンテンツの有効期限を表します。有効期限を過ぎたコンテンツはキャッシュから削除されます。
Last-Modifiedコンテンツの最終更新日時を表します。CGI で動的なデータを扱う場合は、そのデータの最終更新日時になることもあります。
要求ヘッダのフィールド名一覧
フィールド名HTTP/1.0HTTP/1.1説明
Accept×ユーザエージェントが処理できるメディアタイプと、相対的な優先度を表します。mod_negotiation モジュールも参照して下さい。
Accept-Charset×ユーザエージェントが処理できる文字セットと、相対的な優先度を表します。
Accept-Encoding×ユーザエージェントが処理できるエンコード方式と、相対的な優先度を表します。
Accept-Language×ユーザエージェントが処理できる自然言語のセットと、相対的な優先度を表します。
Authorization認証が必要なコンテンツに対するユーザエージェントの認証情報 (credentials値) を表します。関連する情報は AuthName ディレクティブを参照して下さい。
Expect×クライアントの要求に対して、サーバが受け入れ可能か確認する情報を表します。サーバが要求に対して受け入れられない場合は、HTTP ステータスコード 417 Expectation Failed を返します。HTTP/1.1 では 100-continue しか定義されていません。
Fromユーザエージェントを使用しているユーザのメールアドレスを表します。検索エンジンがロボットで探索する場合に、探索に関する問い合わせ先のメールアドレスを通知する際などに利用されます。ただし、セキュリティ上の観点から実装されている例は多くありません。
Host×リクエスト先のサーバ名とポート番号を表します。サーバが 1 つの IP アドレスで複数の URL を持つ仮想ホストをサポートしている場合、このフィールドで指定したサーバ名からどのサーバにアクセスするかを決定します。HTTP/1.1 で唯一の必須ヘッダフィールドです。
If-Match×サーバ上のリソースを特定するための ETag を表します。サーバは指定した ETag にマッチした場合のみ、リクエストを受け付けます。ETag がマッチしない場合、HTTP ステータスコード 412 Precondition Failed を返します。ただし、このフィールドを使用する場合は、弱い Etag を使用することができません。
If-Modified-Sinceサーバ上のリソースを特定するための最終更新日時を表します。サーバは指定した最終更新日時より、リソースの最終更新日時が新しい場合のみ、リクエストを受け付けます。指定した最終更新日時から、リソースが更新されていなければ HTTP ステータスコード 304 Not Modified を返します。
If-None-Match×If-Match フィールドの逆の処理を行います。
If-Range×クライアントがリソースの一部を保持しており、それ以外の残りを最新の場合のみレンジリクエストにより取得します。残りのリソースが最新であるかは、ETag、または最終更新日時を使用して確認します。ETag、または最終更新日時がマッチしない場合は、リソース全体を返します。このフィールドは、Range フィールドと組み合わせて使用します。
If-Unmodified-Since×If-Modified-Since フィールドの逆の処理を行います。
Max-Forwards×HTTP メソッドの TRACE、または OPTIONS において、プロキシサーバの最大ホップ数を表します。プロキシサーバは、この値を -1 して、次のプロキシサーバに転送します。この値が 0 になると、プロキシサーバは最後の受信者としてレスポンスを返します。HTTP メソッドについては <Limit> ディレクティブを参照して下さい。
Proxy-Authorization×プロキシサーバとクライアント間で認証が必要であることを表します。Authorization フィールドがサーバとクライアント間であることに対して、このフィールドはプロキシサーバとクライアント間となります。
Range×リソースの一部分だけを取得する "レンジリクエスト" を行うときの指定範囲を表します。Range フィールド付きのリクエストを受け取ったサーバは、リクエストを処理するとき、HTTP ステータスコード 206 Partial Content レスポンスを返します。Range フィールドを処理できない場合は、HTTP ステータスコード 200 OK として、リソース全体を返します。
Refererリクエストの発生元のリソースの URI を表します。
TE×ユーザエージェントが処理できる拡張転送コーディング方式 (Transfer Coding方式)と、相対的な優先度を表します。拡張転送コーディングの指定以外に、チャンク方式で転送する際の trailer フィールドを解釈可能かどうかをサーバに確認することもできます。
User-Agentリクエストを生成したユーザーエージェントの種別、バージョン情報、プラットフォームなどの情報を表します。フォーマットは特に規定はありません。また、プロキシ経由のリクエストには、プロキシサーバの名前なども付け加えられる可能性があります。
要求ヘッダのフィールド名一覧
フィールド名HTTP/1.0HTTP/1.1説明
Accept-Ranges×リソースの一部だけ指定して取得することができる "レンジリクエスト" を受け付けられるかどうかを表します。受付可能な場合は bytes、受付不可能な場合は none を表します。
Age×エンティティが生成されてからの予測経過時間を秒数で表します。レスポンスを返したサーバがキャッシュサーバーの場合、キャッシュしたレスポンスが再検証されたときから検証した時間になります。プロキシがレスポンスを生成するときには、このフィールドは必須となります。
ETag×リソースを一意に識別するための文字列を表します。ETag は、ファイル識別子、サイズ、更新時刻などの情報から計算されます。ETag は、"強い ETag""弱い ETag" があります。強い ETag は、リソースが 1 Byte も変わらず、また Content-Language などのヘッダも変わっていないことを示します。弱い ETag は、2つのリソースは基本的に同じで実用的にはキャッシュされたものを代用できることを示している。ただし、1 Byte も変わらず同じであることは保証されず、部分リクエストのバリデーションには使えません。
Locationリソースが移動した場合など、ブラウザが要求した URL とは別の飛ばしたい URL を表します。基本的に、HTTP ステータス 3xx Redirection に対して、リダイレクト先の URL を指定する
Proxy-Authenticate×プロキシサーバとクライアント間の認証情報を表します。
Retry-After×クライアントがどれくらい後にリクエストを再試行すべきかを秒数で表します。HTTP ステータスコード 503 Service Unavailable、または 3xx Redirect に対して使われます。
ServerHTTPサーバーのソフトウェアが何かを表します。
Vary×Accept、Accept-Charset、Accept-Language など、サーバ主導型ネゴシエーション (Server Drivenネゴシエーション) で使用されたヘッダ情報を表します。このフィールドは、キャッシュの有効性を判断するために使用されます。例えば、レスポンスに Accept-Language が含まれている場合、クライアント側には Accept-Language: ja のコンテンツがキャッシュされている可能性があることを示します。そのため、Accept-Language: en で要求すると別のコンテンツが返却される可能性があることを通知できます。
WWW-Authenticate×認証が必要であることを表します。認証が必要なリソースが Basic 認証、または Digest 認証であるかを示します。また、指定した認証が必要なリソースを識別するための文字列である "realm" も付与されます。

mod_header のディレクティブはサーバ設定のどこにでも書くことができます。影響する範囲を <FilesMatch> などの設定用セクションで限定することができます。ただし、設定用セクション内に記述されたディレクティブは、設定ファイル内に記述されたディレクティブより後に処理されます。以下の例では、2 つのディレクティブが設定ファイル内に書かれているため、appendunset の順で処理されます。


# append, unset の順で処理される例
Header append MirrorID "mirror 12"
Header unset MirrorID
 append, unset の順で処理される例

上記の例では、上から順番に処理されるため、最終的に MirrorID は unset が処理を行います。そのため、応答ヘッダには MirrorID は現れません。しかし、設定用セクションを使用した場合、処理順が変わります。


# unset, append の順で処理される例
<FilesMatch "\.(html)$">
  Header append MirrorID "mirror 12"
</FilesMatch>
Header unset MirrorID
 unset, append の順で処理される例

上記の例では、設定ファイル内に書かれた unset、設定用セクションに書かれた append の順で処理されるため、最終的に応答ヘッダには "MirrorID: mirror 12" が現れます。

Header ディレクティブ

Header ディレクティブは、HTTP 応答ヘッダを置換、追加、削除できます。ヘッダはコンテンツハンドラや、出力フィルタが実行された直後に実行され、出力されるヘッダを変更できます。以下は、本ディレクティブの構文になります。


# Header ディレクティブの構文
Header [condition] 
       set|append|add|unset|echo header [value] 
       [early|env=[!]variable]
 Header ディレクティブの構文

オプションの conditiononsuccessalways のどちらかを指定できます。これは内部ヘッダテーブルのどれを操作するかを決定します。onsuccess は 2xx ステータスコード、always は全てのステータスコード (2xx を含む) の意味になります。


Header ディレクティブの 2 番目の引数となる setappendaddunsetecho を、以下の表で説明します。

Header ディレクティブの 2 番目の引数一覧
引数名説明
set応答ヘッダを設定します。同じ名前のヘッダが存在する場合はそれを置き換えます。value にはフォーマット文字列を指定することもできます。
append応答ヘッダの既に存在する同じ名前のヘッダに追加します。新しい値が既存のヘッダに追加されるときには、既存のヘッダの後にコンマで区切られて追加されます。これはヘッダに複数の値を指定するときの HTTP の標準の方法です。
addヘッダが既に存在しているときでさえも、応答ヘッダを既存のヘッダに追加します。これにより、2 つ以上のヘッダの名前が同じになることがあります。その結果、想定できないことが起こる可能性がありますので、一般的には append の使用が推奨されます
unsetもし指定された名前の応答ヘッダが存在していれば、削除されます。同じ名前のヘッダが複数あるときは、すべて削除されます。unset を指定する場合は value は設定できません。
echo指定されたものと同じ名前のリクエストヘッダを応答ヘッダでそのまま返します。header には正規表現も指定できます。echo を指定する場合は value は設定できません。

上記の引数の後にはヘッダ名 (header) が続きます。構文には表現されていませんが、ヘッダ名の最後には : を含めることもできます。無くても問題ありません。setappendaddunsetecho は、大文字小文字は区別されません。ただし、echoheader は大文字小文字を区別するため、正規表現で表すときには注意が必要です。


# Header ディレクティブを使ってオリジナルのヘッダを追加する例
Header add MyHeader "Hello."
 Header ディレクティブを使ってオリジナルのヘッダを追加する例
# 実行結果
% curl -I https://murashun.jp/index.html                                                                                            
HTTP/1.1 200 OK
MyHeader: Hello.
 Header ディレクティブを使ってオリジナルのヘッダを追加する例

addappendset では value を 3 番目の引数として指定します。value に空白がある場合は " で囲む必要があります。value は文字だけの文字列、フォーマット指示子を含む文字列、もしくは両方を組み合わせた文字列を指定できます。value は以下のフォーマット指示子をサポートします。

Header ディレクティブの 3 番目の引数 (value) のフォーマット指示子一覧
フォーマット説明
%%パーセント記号を表します。(% を % でエスケープしている)
%tリクエストを受け取った時刻を、Universal Coordinated Time での始まりの時刻 (Jan. 1, 1970) から経過した時間をマイクロ秒として表します。値の最初には t= が付加されます。
%Dリクエストを受け取った時刻と、ヘッダを送り出した時間との差をマイクロ秒として表します。これは、リクエストが存在していた期間を表します。値の最初には D= が付加されます。
%{FOOBAR}e環境変数 FOOBAR の値です。
%{FOOBAR}smod_ssl が有効な場合、SSL 環境変数 FOOBAR の内容

以下の例では、リクエストを受け付けた時刻 (%t)、リクエストを処理した時間 (%D)を応答レスポンスに MyHeader というヘッダ名で追加します。このヘッダはクライアントがサーバの負荷を直観的に知るためや、クライアントとサーバ間のボトルネックを調べるために使うことができます。


# Header ディレクティブを使ってオリジナルのヘッダを追加する例
Header add MyHeader "%t %D"
 サーバの応答時間を調べる例
# 実行結果
% curl -I https://murashun.jp/index.html
HTTP/1.1 200 OK
Date: Sat, 05 Sep 2015 01:28:07 GMT
MyHeader: t=1441416487862010 D=1053
 サーバの応答時間を調べる例

以下の例では、SetEnv ディレクティブを使用して環境変数を設定している例です。


# Header ディレクティブを使ってオリジナルのヘッダを追加する例
SetEnv SPECIAL_PATH /foo/bin
Header add MyHeader "%{SPECIAL_PATH}e"
 環境変数を設定する例
# 実行結果
% curl -I https://murashun.jp/index.html                                                                                            
HTTP/1.1 200 OK
MyHeader: /foo/bin
 環境変数を設定する例

RequestHeader ディレクティブ

RequestHeader ディレクティブは、HTTP 要求ヘッダを置換、追加、削除できます。ヘッダはコンテンツハンドラが実行される直前に実行され、入力されるヘッダを変更することが可能になっています。以下は、本ディレクティブの構文になります。


# Header ディレクティブの構文
RequestHeader set|append|add|unset header [value]
              [early|env=[!]variable]
 Header ディレクティブの構文
RequestHeader ディレクティブの 2 番目の引数一覧
引数名説明
set要求ヘッダを設定します。同じ名前のヘッダが存在する場合はそれを置き換えます。
append要求ヘッダの既に存在する同じ名前のヘッダに追加します。新しい値が既存のヘッダに追加されるときには、既存のヘッダの後にコンマで区切られて追加されます。これはヘッダに複数の値を指定するときの HTTP の標準の方法です。
addヘッダが既に存在しているときでさえも、要求ヘッダを既存のヘッダに追加します。これにより、2 つ以上のヘッダの名前が同じになることがあります。その結果、想定できないことが起こる可能性がありますので、一般的には append の使用が推奨されます
unsetもし指定された名前の要求ヘッダが存在していれば、削除されます。同じ名前のヘッダが複数あるときは、すべて削除されます。unset を指定する場合は value は設定できません。

本ディレクティブの引数である headervalue については、Header ディレクティブと同じですので、 詳細はそちらを参照して下さい。

mod_imagemap

以下は、mod_imagemap モジュールのディレクティブの一覧です。mod_imagemap は、サーバサイドで画像を処理するモジュールです。このモジュールを使うことで、画像の任意の部分にリンクを設定することができます。ただし、Apache 1.3.39 以前、2.0.61 以前、2.2.6 以前のモジュールにはクロスサイトスクリプティングの脆弱性が存在します。 ベンダが提供する最新版にアップデートすることで、脆弱性の問題を修正できます。


mod_imagemap は、イメージマップ (またはクリッカブル・マップ) ファイルを扱います。イメージマップファイルには、"サーバサイド・イメージマップ" と "クライアントサイド・イメージマップ" の 2 種類があります。mod_imagemap は、サーバサイド・イメージマップを使用します。イメージマップを使用するには、imap-file ハンドラにマップファイル (.map) を対応付ける必要があるため、AddHandler ディレクティブで対応付けます。


# imap-file ハンドラにマップファイルを対応付ける。
AddHandler imap-file .map
 イメージマップのフォーマット

マップファイルの対応付けが完了したら、次はマップファイルを作成します。マップファイルには、directive(命令)、value(値)、[x,y ...](座標)、説明文 の 4 つの要素があります。4 つの要素の書き方には順序があり、以下の 3 通りの指定ができます。


# イメージマップのフォーマット
directive value [x,y ...]
directive value "Menu text" [x,y ...]
directive value x,y ... "Menu text"
 イメージマップのフォーマット

" に囲まれた文字列は、イメージマップファイル表示時の説明文になります。x,y の座標は画像の x 座標と y座標になります。ただし、下表の basedefault は説明文と座標を指定できないため、記述を省略します。directivevalue の値は下表に示します。

directive 一覧
説明
baseマップファイル内での相対 URL を指定します。
defaultマップファイル内にデフォルトのリンク先の領域を定義します。
point がある場合、pointで指定した領域がデフォルトの領域になります。
point がない場合、polycirclerect 以外の領域がデフォルトになります。
poly多角形を指定します。座標は、3 ~ 100 点の範囲で指定できます。
circle円を指定します。座標は、中心点と円周上の 1 点を指定できます。
rect四角形を指定します。座標は、対角となる 2 点を指定します。
point点を指定します。点の範囲は、クリックした点から最も近い点が有効になります。
point を指定した場合、default は無効になります。
value 一覧
説明
URLリンク先の URL を指定します。
base や ImapBase ディレクティブが定義されている場合、そこからの相対パスとなります。
mapマップファイルメニューを表示します。
ただし、ImapMenu ディレクティブで none を指定した場合は、表示されません。
menumap と同様です。
refererHTTP ステータスコード 302 を返します。
nocontentHTTP ステータスコード 204 を返します。
base を除くすべての命令に有効です。
errorHTTP ステータスコード 500 を返します。
base を除くすべての命令に有効ですが、default 以外は不適当です。


上記の説明を元に、サーバサイド・イメージマップを行う例としては、以下のようになります。


# .htaccess
AddHandler imap-file .map

# imagemap.map
default /
rect https://murashun.jp/ "四角形" 20,20 80,80

# sample.html
<a href="/maps/imagemap.map">
  <img ismap src="/img/imagemap.gif">
</a>
 サーバサイド・イメージマップの例

ImapBase ディレクティブ

ImapBase ディレクティブは、マップファイルで使われるデフォルトの URL を設定できます。指定しない場合は、デフォルト値として、http://servername/ になります。以下は、本ディレクティブの構文になります。


# ImapBase ディレクティブの構文
ImapBase map|referer|URL
 ImapBase ディレクティブの構文

ImapDefault ディレクティブ

ImapDefault ディレクティブは、マップファイルの中で使われる default のデフォルト値を URLmapreferernocontenterror から指定することができます。指定しない場合は、nocontent となります。


# ImapDefault ディレクティブの構文
ImapDefault error|nocontent|map|referer|URL
 ImapDefault ディレクティブの構文

ImapMenu ディレクティブ

ImapMenu ディレクティブは、イメージマップのメニュー表示を設定できます。


# ImapMenu ディレクティブの構文
ImapMenu none|formatted|semiformatted|unformatted
 ImapMenu ディレクティブの構文
value 一覧
説明
noneイメージマップのメニューを表示しません。
ただし、マップファイルの default で定義した動作を行います。
formattedヘッダ、およびリンク一覧を表示します。
ただし、マップファイルで定義した説明文は表示されません。
semiformattedリンク一覧、およびマップファイルで定義した説明文を表示します。
unformattedマップファイルの中に HTML を記述することで、オリジナルのメニューを設定できます。

mod_include

以下は、mod_include モジュールのディレクティブの一覧です。mod_include は、ファイルがクライアントに送られる前に処理するフィルタを提供します。ファイルがクライアントに送られる前に処理される具体例としては、SSI (Server Side Includes) があります。


SSI についての詳細は、SSI (Server Side Includes) の書き方を参照して下さい。

SSIEnableAccess ディレクティブ

SSIEnableAccess ディレクティブは、条件処理において -A フラグの有効・無効を制御します。-A フラグは、指定したディレクトリにアクセス可能であるかをテストします。例えば、<!--#if expr="-A /foo"--> は、/foo にアクセスできなければ false、それ以外は true と評価されます。デフォルトの値は off となります。

echo 要素の var 属性で使用可能な環境変数一覧
説明
offフロー制御要素において、-A フラグが無効になります。
onフロー制御要素において、-A フラグが有効になります。

SSIEndTag ディレクティブ

SSIEndTag ディレクティブは mod_include が探す include 要素の終了を示す文字列を変更します。デフォルトの値は --> になります。本ディレクティブは Apache 2.0.30 以降で使用可能です。


# SSIEndTag を設定する
SSIEndTag "%>"
 SSIEndTag を設定する例

SSIErrorMsg ディレクティブ

SSIErrorMsg ディレクティブは mod_include がエラーが起こったときに表示するメッセージを変更します。デフォルトの値は [an error occurred while processing this directive] になります。また、本ディレクティブは config 要素の errmsg 属性と同じ動作になります。本ディレクティブは Apache 2.0.30 以降で使用可能です。


# SSIErrorMsg を設定する
SSIErrorMsg "<!-- Error -->"
 SSIErrorMsg を設定する例

SSIETag ディレクティブ

SSIETag ディレクティブは、サーバが生成する ETag ヘッダを抑制することができます。デフォルトの値は off になります。on を設定した場合は、サーバによって生成された ETag が付与されます。本ディレクティブは、Apache 2.2.15 以降で使用可能です。

SSILastModified ディレクティブ

SSIETag ディレクティブは、サーバが生成する Last-Modified ヘッダを抑制することができます。デフォルトの値は off になります。on を設定した場合は、サーバによって生成された Last-Modified が付与されます。本ディレクティブは、Apache 2.2.15 以降で使用可能です。

SSIStartTag ディレクティブ

SSIStartTag ディレクティブは、mod_include が探す include 要素の開始を示す文字列を変更します。デフォルトの値は <!--# になります。本ディレクティブは Apache 2.0.30 以降で使用可能です。


# SSIStartTag を設定する
SSIStartTag "<%"
 SSIStartTag を設定する例

SSITimeFormat ディレクティブ

SSITimeFormat ディレクティブは、日付けを表す文字列の書式を設定できます。書式を設定する関数は、C 標準ライブラリの strftime 関数と同じ形式です。また、本ディレクティブは config 要素の timefmt 属性と同じ動作になります。本ディレクティブは Apache 2.0.30 以降で使用可能です。


# SSITimeFormat を設定する
SSITimeFormat "%R, %B %d, %Y"
 SSITimeFormat を設定する例

SSIUndefinedEcho ディレクティブ

SSITimeFormat ディレクティブは、未定義の変数が "echo" されたときに mod_include が表示する文字列を変更します。また、本ディレクティブは config 要素の echomsg 属性と同じ動作になります。本ディレクティブは Apache 2.0.34 以降で使用可能です。


# SSIUndefinedEcho を設定する
SSIUndefinedEcho "<!-- undef -->"
 SSIUndefinedEcho を設定する例

XBitHack ディレクティブ

XBitHack ディレクティブは、通常の HTML ドキュメントに対して SSI ディレクティブ解析の実施有無を制御します。MIME タイプ(Content-Type) が text/html と関連付けられているファイルにのみ影響します。以下は、本ディレクティブの構文となります。


# XBitHack の構文
XBitHack on|off|full
 XBitHack の構文
# chmod コマンドで実行ビットを立てる例
% chmod +x sample.shtml

# 実行ビット (x) が付与された
% ls -l
-rwxr-xr-x  1 murashun  users  85 Aug 31 10:39 sample.html
 chmod コマンドで実行ビットを立てる例
echo 要素の var 属性で使用可能な環境変数一覧
説明
off実行ビットが立っているファイルに対して SSI ディレクティブを解析を行いません。
on実行ビットが立っているファイルに対して SSI ディレクティブを解析を行います。
full実行ビットが立っているファイルに対して SSI ディレクティブを解析を行います。
加えて、グループ実行ビットが立っているかのテストも行います。設定されている場合は、レスポンスファイルの Last-modified の 日付をファイルの最終修正時刻にします。

mod_mime

以下は、mod_mime モジュールのディレクティブの一覧です。mod_mime は、拡張子に使って メタ情報 をファイルに関連付けるために使用されます。メタ情報は、ドキュメントのファイル名と、MIME タイプ(Content-Type)、言語、文字セット、エンコーディングとを関連付けます。メタ情報は、ブラウザに送信され、複数のファイルの中からユーザに最適なファイルが選ばれるように、コンテンツネゴシエーションでも使われます。コンテンツネゴシエーションについては、mod_negotiation を参照して下さい。

AddCharset ディレクティブ

AddCharset ディレクティブは、extension (拡張子) に指定された charset を関連付けます。charset は、MIME charset パラメータです。新しいマッピングは既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。また、extension は大文字小文字を区別せず . は省略できます。


# AddCharset の構文
AddCharset charset extension [extension] ...
 AddCharset の構文
# AddCharset の設定例
AddLanguage ja .ja
AddCharset EUC-JP .euc
AddCharset ISO-2022-JP .jis
AddCharset SHIFT_JIS .sjis
 AddCharset の設定例

上記の例では、ドキュメント xxxx.ja.jis は charset が ISO-2022-JP の日本語のドキュメントとして扱われます (xxxx.jis.ja も同様です)。本ディレクティブは、ドキュメントが適切に解釈されて表示されるように、ドキュメントの charset をクライアントに通知するために有効です。また、サーバがクライアントの charset の優先度によって、複数のドキュメントの中から最適なドキュメントを選ぶコンテントネゴシエーションにも有効です。

AddEncoding ディレクティブ

AddEncoding ディレクティブは、extension (拡張子) に指定された MIME-enc (エンコーディング) を関連付けます。MIME-enc は、拡張子を含むドキュメントに使用する MIME エンコーディングです。新しいマッピングは既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。また、extension は大文字小文字を区別せず . は省略できます。


# AddEncoding の構文
AddEncoding MIME-enc extension [extension] ...
 AddEncoding の構文
# AddEncoding の設定例
AddEncoding x-gzip .gz
AddEncoding x-compress .Z
 AddEncoding の設定例

上記の例では、拡張子 .gz を含むファイル名が x-gzip エンコーディングを使ってエンコードされていることと、拡張子 .Z を含むファイル名が x-compress でエンコードされていることを指定します。

AddHandler ディレクティブ

AddHandler ディレクティブは、extension (拡張子) に指定された handler-name (ハンドラ) を関連付けます。ハンドラについては、SetHandler ディレクティブを参照して下さい。新しいマッピングは既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。また、extension は大文字小文字を区別せず . は省略できます。


# AddHandler の構文
AddHandler handler-name extension [extension] ...
 AddHandler の構文
# AddHandler の設定例
AddHandler cgi-script .cgi
 AddHandler の設定例

上記の例では、拡張子 ".cgi" で終わるファイルを CGI スクリプトとして扱います。

AddInputFilter ディレクティブ

AddInputFilter ディレクティブは、extension (拡張子) をクライアントのリクエストを処理する filter (入力フィルター) に関連付けます。新しいマッピングは、SetInputFilter ディレクティブの他のディレクティブで定義されている既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。複数のフィルタを指定するときは、データを処理する順番に ; で繋いで書く必要があります。また、extension は大文字小文字を区別せず . は省略できます。本ディレクティブは、Apache 2.0.26 以降で使用可能です。


# AddInputFilter の構文
AddInputFilter filter [;filter] extension [extension] ...
 AddInputFilter の構文

AddLanguage ディレクティブ

AddLanguage ディレクティブは、extension (拡張子) に指定された MIME-lang (言語) を関連付けます。MIME-lang は、拡張子を含むドキュメントの MIME における言語です。新しいマッピングは既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。また、extension は大文字小文字を区別せず . は省略できます。


# AddLanguage の構文
AddLanguage MIME-lang extension [extension] ...
 AddLanguage の構文
# AddLanguage の設定例
AddEncoding x-compress .Z
AddLanguage en .en
AddLanguage fr .fr
 AddLanguage の設定例

上記の例では、xxxx.en.Z ドキュメントは compress された英語のドキュメントとして扱われます (xxxx.Z.en も同様)。また、サーバがクライアントの言語の優先度によって、複数のドキュメントの中から最適なドキュメントを選ぶコンテントネゴシエーションにも有効です。複数の言語が同じ拡張子に割り当てられている場合は、最後に設定された言語が優先されます。以下の場合は、en-us が優先されます。


# 複数の言語が同じ拡張子に割り当てられている設定例
AddLanguage en .en
AddLanguage en-gb .en
AddLanguage en-us .en
 複数の言語が同じ拡張子に割り当てられている設定例

AddOutputFilter ディレクティブ

AddOutputFilter ディレクティブは、extension (拡張子) をサーバのレスポンスを処理する filter (出力フィルター) に関連付けます 新しいマッピングは、SetOutputFilter ディレクティブと AddOutputFilterByType ディレクティブ を含め、他のディレクティブで定義されている既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。複数のフィルタを指定するときは、データを処理する順番に ; で繋いで書く必要があります。また、extension は大文字小文字を区別せず . は省略できます。本ディレクティブは、Apache 2.0.26 以降で使用可能です。


# AddOutputFilter の構文
AddOutputFilter filter [;filter] extension [extension] ...
 AddOutputFilter の構文

AddType ディレクティブ

AddType ディレクティブは、extension (拡張子) に指定された MIME-type (MIME タイプ(Content-Type)) を関連付けます。新しいマッピングは既存のマッピングに追加され、同じ拡張子 extension のマッピングを上書きします。また、extension は大文字小文字を区別せず . は省略できます。


# AddType の構文
AddType MIME-type extension [extension] ...
 AddType の構文
# AddType の設定例
AddType image/gif .gif
 AddType の設定例

DefaultLanguage ディレクティブ

DefaultLanguage ディレクティブは、あるディレクティブのスコープの範囲内 (例えば、<Directory> の範囲内) にある言語拡張子 (例えば、AddLanguage ディレクティブで設定される .fr や .de) のないすべてのファイルを、指定された MIME-lang 言語であるとみなします。本ディレクティブを使用することにより、ファイル名を変更することなく任意の言語を含むコンテンツであると指定することができます。ただし、本ディレクティブでは、1 つの言語しか指定できないことに注意して下さい。


DefaultLanguage ディレクティブが有効でなく、ファイルに AddLanguage で設定された言語の拡張子がない場合、ファイルには言語属性がないとみなされます。


# DefaultLanguage の構文
DefaultLanguage MIME-lang
 DefaultLanguage の構文
# DefaultLanguage の設定例
DefaultLanguage ja
 DefaultLanguage の設定例

MultiviewsMatch ディレクティブ

MultiviewsMatch ディレクティブは、mod_negotiation モジュールの Multiviews 探索マッチの挙動を 3 パターンから選択することができます。指定できる文字列は AnyNegotiatedOnlyFiltersHandlers の 4 種類です。FiltersHandlers は片方、または両方を設定できます。


# MultiviewsMatch の構文
MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers [Filters]
 MultiviewsMatch の構文
MultiviewsMatch ディレクティブの値一覧
説明
Anymod_mime が認識しないどんな拡張子でもマッチします。
NegotiatedOnly拡張子に指定される文字セット、MIME タイプ(Content-Type)、言語、エンコーディング のすべてが関連付けが行われている場合にマッチします。このオプションは最も的確な実装で、デフォルト値になります。
Filters
Handlers [Filters]
拡張子に指定されるハンドラとフィルタの片方、または両方が関連付けが行われている場合にマッチします。

RemoveCharset ディレクティブ

RemoveCharset ディレクティブは、extension (拡張子) に指定された charset の関連付けを取り消します。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。本ディレクティブは、Apache 2.0.24 以降で使用可能です。


# RemoveCharset の構文
RemoveCharset extension [extension] ...
 RemoveCharset の構文
# RemoveCharset の設定例
RemoveCharset .html .shtml
 RemoveCharset の設定例

RemoveEncoding ディレクティブ

RemoveEncoding ディレクティブは、 extension (拡張子) に指定された MIME-enc (エンコーディング) の関連付けを取り消します。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。


# RemoveEncoding の構文
RemoveEncoding extension [extension] ...
 RemoveEncoding の構文
# RemoveEncoding の設定例
# /foo/.htaccess
AddEncoding x-gzip .gz
AddType text/plain .asc
<Files *.gz.asc>
  RemoveEncoding .gz
</Files>
 RemoveEncoding の設定例

上記の設定例では、例えば foo.gz は gzip でエンコードされることを指定していますが、foo.gz.asc はエンコードされていないプレーンテキストのファイルであることを意味します。

RemoveHandler ディレクティブ

RemoveHandler ディレクティブは、extension (拡張子) に指定された handler-name (ハンドラ) の関連付けを取り消します。ハンドラについては、SetHandler ディレクティブを参照して下さい。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。


# RemoveHandler の構文
RemoveHandler extension [extension] ...
 RemoveHandler の構文
# RemoveHandler の設定例
# /foo/.htaccess:
AddHandler server-parsed .html

# /foo/bar/.htaccess:
RemoveHandler .html
 RemoveHandler の設定例

上記の例では、例えば /foo/bar ディレクトリの .html ファイルは SSI ではなく、通常の HTML ファイルとして扱われます。

RemoveInputFilter ディレクティブ

RemoveInputFilter ディレクティブは、extension (拡張子) をクライアントのリクエストを処理する filter (入力フィルター) の関連付けを取り消します。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。本ディレクティブは、Apache 2.0.26 以降で使用可能です。


# RemoveInputFilter の構文
RemoveInputFilter extension [extension] ...
 RemoveInputFilter の構文

RemoveLanguage ディレクティブ

RemoveLanguage ディレクティブは、extension (拡張子) に指定された MIME-lang (言語) の関連付けを取り消します。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。本ディレクティブは、Apache 2.0.24 以降で使用可能です。


# RemoveLanguage の構文
RemoveLanguage extension [extension] ...
 RemoveLanguage の構文

RemoveOutputFilter ディレクティブ

RemoveOutputFilter ディレクティブは、extension (拡張子) をサーバのレスポンスを処理する filter (出力フィルター) の関連付けを取り消します。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。本ディレクティブは、Apache 2.0.26 以降で使用可能です。


# RemoveOutputFilter の構文
RemoveOutputFilter extension [extension] ...
 RemoveOutputFilter の構文

RemoveType ディレクティブ

RemoveType ディレクティブは、extension (拡張子) に指定された MIME-type (MIME タイプ(Content-Type)) の関連付けを取り消します。この設定は、上位ディレクトリから継承した設定も同様に取り消すことができます。また、extension は大文字小文字を区別せず . は省略できます。


# RemoveType の構文
RemoveType extension [extension] ...
 RemoveType の構文

本ディレクティブは、AddType ディレクティブの後に処理されるため、同じディレクトリの設定においては処理順に注意して下さい。

mod_negotiation

以下は、mod_negotiation モジュールのディレクティブの一覧です。mod_negotiation は、コンテンツネゴシエーション機能を提供します。コンテンツネゴシエーション機能とは、複数用意されているドキュメントから、クライアントに最適なドキュメントを提供する機能です。例えば、異なる言語で書かれた複数のドキュメントがある場合、サーバが自動的にクライアントに最適な言語を選択するなどです。これは、ブラウザがリクエスト毎に、どの言語が最適であるかをサーバに通知していることで実現しています。ブラウザが日本語のドキュメントを要求する場合は、リクエストのヘッダに日本語を指定しています。


# 日本語のドキュメントをリクエストするヘッダ
Accept-Language: ja
 日本語のドキュメントをリクエストするヘッダ

上記の例では、日本語のみのリクエストですが、Web サイトによっては複数の言語で書かれたドキュメントが用意されているわけではありません。その場合、複数の言語をリクエストすることができます。以下の例では、日本語と英語を受け付けるが、日本語を優先してリクエストしている例です。


# 日本語、または英語のドキュメントをリクエストするヘッダ
Accept-Language: ja; q=1.0, en; q=0.5
 日本語、または英語のドキュメントをリクエストするヘッダ

Accept-Language ヘッダーでは、q (品質値) 属性を使用して、0.0~ 1.0 までの範囲で優先レベルを設定することができます。品質値は、数値が高いほど優先されるため、上記の例では日本語を優先してリクエストしています。もしも、指定する言語のドキュメントが存在しない場合は、最終手段として * 表現があります。ワイルドカードで表現されたリクエストは、コンテンツネゴシエーションが成立しなかった場合の最終的なレスポンスとなります。


# 日本語、または英語、またはその他の言語のドキュメントをリクエストするヘッダ
Accept-Language: ja; q=1.0, en; q=0.5, *; q=0.1
 日本語、または英語、またはその他の言語のドキュメントをリクエストするヘッダ

コンテンツネゴシエーションを実装する方法は 2 つあります。1 つは、タイプマップを使用する方法、もう 1 つは、Multiviews を使う方法です。もしも、両方が有効である場合、タイプマップの設定が優先されます。


タイプマップ (*.var ファイル) は、type-map ハンドラに関連付けられたドキュメントです。この機能を使うためには、AddHandler ディレクティブにより、拡張子にハンドラを関連付ける方法が一般的です。


# タイプマップの機能を使用するための設定例
AddHandler type-map .var
 タイプマップの機能を使用するための設定例

タイプマップファイルは、コンテンツネゴシエーションを提供するリソースと同じ名前を設定します。例えば、foo.ja.html と foo.en.html に対してタイプマップファイルを作成する場合は、foo.var になります。タイプマップファイルの設定では、以下のように foo.ja.html と foo.en.html にそれぞれのエントリを持つ必要があります。


# タイプマップの機能を使用するための設定例
URI: foo.ja.html
Content-type: text/html
Content-language: ja

URI: foo.en.html
Content-type: text/html
Content-language: en
 タイプマップの機能を使用するための設定例 (foo.var)

また、画像のコンテンツネゴシエーションにおいて、クライアントからの要求に優先度の差がなかった場合、qs 属性で "画像の品質" を指定することができます。クライアントは、qs の属性値が最も大きい画像を受け取ることができます。qs の属性値は 0.000 ~ 1.000 までの範囲で指定できます。ただし、0.000 を指定した場合は、選択されないことに注意して下さい。また、qs 属性を省略した場合は、1.000 が設定されます。


# タイプマップの機能を使用するための設定例
URI: foo.jpeg
Content-type: image/jpeg; qs=0.8

URI: foo.gif
Content-type: image/gif; qs=0.5

 タイプマップの機能を使用するための設定例 (foo.var)

例えば、写真を表現する場合は、gif 画像よりも jpeg 画像の方が高い品質になります。上記の例では、jpeg 画像の方が高い値を設定してありますが、アイコンなどの画像では gif 画像の方が高い品質になります。そのため、qs の属性値は表現されるリソースの性質によって、異なる値になります。タイプマップに設定できるヘッダは以下の通りです。

タイプマップに設定可能なヘッダ一覧
説明
Content-Encoding:ファイルのエンコーディングを指定します。
Content-Language:インターネット標準の言語タグ (RFC 1766) で定義されている言語を指定します。例えば、en は英語を表します。複数の言語が格納される場合は , で区切られます。
Content-Length:ファイルの長さ (バイト数) を指定します。このヘッダがない場合、ファイルの実際の長さが使用されます。
Content-Type:ドキュメントの MIME タイプ(Content-Type) を、パラメータ付きで指定します。パラメータの構文は name=value です。複数のパラメータがある場合は、; で分割します。共通のパラメータは以下の通りです。
level
メディアタイプのバージョンを示す整数を指定します。
text/html では 2 がデフォルトで、その他の場合は 0 がデフォルトです。
qs
リソースの性質によって異なる相対的な品質値を指定します。
0.000 ~ 1.000 までの範囲で指定します。
URI:コンテンツネゴシエーションの対象ファイルをマップファイルからの相対パスで指定します。クライアントからリクエストしたときに、アクセスを許可しているディレクトリでなければなりません。
Body:タイプマップファイルに出力される文字列を記述することができます。このヘッダに記述した内容は、任意の区切り文字列から、同じ区切り文字列が見つかるまでとなります。
Body:----xyz----
<html><body>
<p>Content of the page.</p>
</body></html>
----xyz----

MultiViews は、Options ディレクティブの MultiViews オプションを指定することで有効になります。MultiViews は、クライアントからのリクエストが見つからない場合に、探索を行います。例えば、/some/dir/foo へのリクエストを受け取り、/some/dir/foo が存在 しない場合、foo.* にあてはまるすべてのファイルを探索します。複数のファイルが見つかった場合、クライアントの要求に最適なファイルを選び、そのドキュメントを返します。そのドキュメントのメディアタイプとコンテンツエンコーディングは、そのファイルを直接指定した場合のものと同じものが設定されます。


ファイルを選択する際に、MIME タイプ(Content-Type)、言語、文字セット、エンコーディングについて判定を行うかどうかは MultiViewsMatch ディレクティブで設定できます。

ForceLanguagePriority ディレクティブ

ForceLanguagePriority ディレクティブは、リクエストに最適なドキュメントを 1 つだけ返すことができない場合に LanguagePriority ディレクティブを使ってネゴシエーションの結果を返します。以下は、本ディレクティブの構文となります。


# ForceLanguagePriority ディレクティブの構文
ForceLanguagePriority None|Prefer|Fallback [Prefer]
 ForceLanguagePriority ディレクティブの構文
# ForceLanguagePriority ディレクティブの設定例
LanguagePriority en fr de
ForceLanguagePriority Prefer
 ForceLanguagePriority ディレクティブの設定例
ForceLanguagePriority ディレクティブの設定値一覧
説明
None本ディレクティブの機能を無効にします。
Preferクライアントからの Accept-Language ヘッダに複数の言語が指定され、かつサーバに指定された複数の言語のコンテンツが存在する場合、HTTP ステータスコード 300 (Multiple Choices) を返す代わりに、LanguagePriority ディレクティブで設定された優先順位の高い言語に一致するコンテンツを返します。言語の優先順位が同じ場合は、最初に一致した言語のコンテンツを返します。
Fallbackクライアントからの Accept-Language ヘッダに指定された言語のコンテンツが存在しない場合、HTTP ステータスコード 406 (Not Acceptable) を返す代わりに、LanguagePriority ディレクティブに設定された優先順位の高い言語と一致するコンテンツを返します。

Prefer と Fallback の両方のオプションを指定した場合は、複数の言語のコンテンツが存在すれば LanguagePriority ディレクティブに設定された最初のコンテンツが返され、指定された言語のコンテンツが存在しなければ最初のコンテンツを返します。

LanguagePriority ディレクティブ

LanguagePriority ディレクティブは、クライアントからの Accept-Language ヘッダに言語の優先順位が指定されていない場合、使用する言語の優先順位を設定します。設定された言語は、優先度の降順で並びます。本ディレクティブは、ForceLanguagePriority ディレクティブに PreferFallback が 1 つ以上指定されている場合に有効となります。None が設定されている場合は、本ディレクティブの設定は無効になります。以下は、本ディレクティブの構文となります。


# LanguagePriority ディレクティブの構文
LanguagePriority MIME-lang [MIME-lang] ...
 LanguagePriority ディレクティブの構文
# LanguagePriority ディレクティブの設定例
LanguagePriority en fr de
 LanguagePriority ディレクティブの設定例

mod_setenvif

以下は、mod_setenvif モジュールのディレクティブの一覧です。mod_setenvif は、リクエストの特徴に合わせて環境変数の設定を可能にします。このモジュールが提供するディレクティブは、設定ファイルに現れる順番に適用されます。

BrowserMatch ディレクティブ

BrowserMatch ディレクティブは、 User-Agent HTTP リクエストヘッダの内容と regex が一致した場合、env-variable を設定します。regex には、正規表現が使用できます。env-variableには、環境変数を指定します。env-variable には、! や、指定した値 value が設定できます。以下は、本ディレクティブの構文となります。


# BrowserMatch ディレクティブの構文
BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]] ...
 BrowserMatch ディレクティブの構文
# BrowserMatch ディレクティブの設定例
BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
BrowserMatch MSIE !javascript
 BrowserMatch ディレクティブの設定例
BrowserMatch ディレクティブの設定値一覧
説明
env-variable指定した環境変数の値を "1" に設定します。
!env-variable指定した環境変数がすでに設定されていた場合、その環境変数を削除します。
env-variable=value指定した環境変数に、指定した値を設定します。

Apache 2.0.51 以降では、value 内に $1..$9 が存在すれば、それらを認識し、regex の対応する丸括弧で囲まれた部分で置換します。詳細は、"後方置換" の章を参照して下さい。

BrowserMatchNoCase ディレクティブ

BrowserMatchNoCase ディレクティブは、BrowserMatch ディレクティブと同様の機能です。ただし、regex 属性に指定した正規表現を評価するときに、大文字と小文字を区別しません。以下は、本ディレクティブの構文となります。


# BrowserMatchNoCase ディレクティブの構文
BrowserMatchNoCase regex [!]env-variable[=value] [[!]env-variable[=value]] ...
 BrowserMatchNoCase ディレクティブの構文

SetEnvIf ディレクティブ

クライアントからのリクエストヘッダに含まれる attribute が、指定した regex と一致した場合、env-variable を設定します。regex には、正規表現が使用できます。環境変数については、"HTTP環境変数" の章を参照して下さい。以下は、本ディレクティブの構文となります。


# SetEnvIf ディレクティブの構文
SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
 SetEnvIf ディレクティブの構文

attribute には、HTTP リクエスト (RFC 2616 (例えば、HostUser-AgentRefererAccept-Language など))、または以下のリクエストヘッダの情報を指定します。

BrowserMatch ディレクティブの設定値一覧
説明
Remote_Hostクライアント、またはプロキシサーバなどのホスト名
Remote_Addrクライアント、またはプロキシサーバなどのIPアドレス
Server_Addrリクエストを受け取ったサーバの IP アドレス (Apache 2.0.43 以降)
Request_Method使用される HTTP メソッド名 (GETPOST など)
Request_Protocolプロトコルの名前とバージョン情報 (HTTP/1.0HTTP/1.1 など)
Request_URIURL のスキームとホスト名に続くパス情報

env-variableregex については、BrowserMatch ディレクティブと同様です。


# SetEnvIf ディレクティブの設定例
SetEnvIf Request_URI "\.gif$" object_is_image=gif
SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
:
SetEnvIf Referer www\.mydomain\.com intra_site_referral
:
SetEnvIf object_is_image xbm XBIT_PROCESSING=1
:
SetEnvIf ^TS* ^[a-z].* HAVE_TS
 SetEnvIf ディレクティブの設定例

SetEnvIfNoCase ディレクティブ

本ディレクティブは、SetEnvIfディレクティブと同様の機能です。ただし、regex 属性に指定した正規表現を評価するときに、大文字と小文字を区別しません。以下は、本ディレクティブの構文となります。


# SetEnvIfNoCase ディレクティブの構文
SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
 SetEnvIfNoCase ディレクティブの構文

mod_dir

以下は、mod_dir モジュールのディレクティブの一覧です。mod_dir は、ディレクトリへのリダイレクトと、ディレクトリのインデックスファイルを扱う機能を提供します。

DirectoryIndex ディレクティブ

DirectoryIndex ディレクティブは、クライアントがディレクトリ名の最後に / を指定した場合に返すディレクトリインデックス(例えば、index.html、index.php など)を設定できます。複数のディレクトリインデックスを指定している場合は、最初に見つかったものを返します。それらが見つからず、Options ディレクティブ の Indexes が設定されている場合、ディレクトリのリストを返します。


# DirectoryIndex を設定する
DirectoryIndex index.html index.txt /cgi-bin/index.pl
 DirectoryIndex を設定する例

上記の例では、index.html と index.txt のどちらもディレクトリ内に存在しない場合、CGI スクリプト /cgi-bin/index.pl が実行されます。ドキュメントが同じディレクトリ内に存在するは必要ありません。また、ディレクトリインデックスが見つからない場合は、以下のような画面が表示されます。


ディレクトリとファイルの一覧
ディレクトリとファイルの一覧

DirectorySlash ディレクティブ

DirectorySlash ディレクティブは、要求のあった URL がディレクトリを指すかを設定できます。例えば、ユーザが URL の末尾に / 無しでリソースにリクエストし、そのリソースがディレクトリを指していた場合、末尾に / を付けてリダイレクトします。デフォルト値は On になっており / が自動的に付くようになっています。本ディレクティブの設定を Off にした場合、DirectoryIndex ディレクティブが URL の末尾に / が付いていないと評価しないため、ディレクトリのリストが表示され情報漏洩を招く可能性があります。


# DirectorySlash を設定する
DirectorySlash On
 DirectorySlash を設定する例

FallbackResource ディレクティブ

FallbackResource ディレクティブは、リクエストされたファイルが存在しない場合、指定されたパスにリダイレクトします。本ディレクティブは、Apache 2.2.16 以降で使用可能です。


# FallbackResource を設定する
FallbackResource /not-404.php
 FallbackResource を設定する例

上記の例では、リクエストされたファイルが存在しない場合、not-404.php によって処理が行われます。本ディレクティブが使用できないバージョンでは、RewriteCond ディレクティブの -f-d オプションを使ってファイルやディレクトリの存在確認を行います。本ディレクティブの機能を無効にするには disabled を指定します。この設定値は Apache 2.2.24 以降で使用可能です。

mod_rewrite

以下は、mod_rewrite モジュールのディレクティブの一覧です。mod_rewrite は、多くのレンタルサーバーで利用可能なモジュールで、多くの設定レシピなどに RewriteCondRewriteRule が登場します。

RewriteEngine ディレクティブ

RewriteEngine ディレクティブは、URL の書き換えを行うエンジンです。本ディレクティブを有効、または無効にすることで、URL の書き換え処理を制御することができます。デフォルトの設定値は Off になっているため、URL の書き換え処理を行う場合は、On にする必要があります。


# RewriteEngine を起動
RewriteEngine On
 RewriteEngine を起動する例

本ディレクティブを On にすることで、新しい環境変数 SCRIPT_URISCRIPT_URL が追加されます。

RewriteBase ディレクティブ

RewriteBase ディレクティブは、RewriteRule ディレクティブで指定するリダイレクト先の URL のベースとなるディレクトリを相対パスで指定できます。RewriteBase ディレクティブで URL を指定しない場合、RewriteRule ディレクティブのベースとなる URL は .htaccess が置かれたディレクトリからの相対パスとなります。


/www
|-- .htaccess
|
|-- /contents
    |-- index.html
    |-- index.php
 RewriteBase を行う配置例

# RewriteEngineを起動
RewriteEngine On

# ベースとなる変更前の URL(.htaccessを格納しているディレクトリ)
# /www (http://murashun.jp)

# RewriteBase でベースとなる URL を変更
# /www/contents (https://murashun.jp/contents)
RewriteBase /contents

# RewriteRule で index.php にリダイレクトする。
# RewriteBase で変更された URL は index.php にのみ影響します。
RewriteRule contents/index.html index.php [R=301,L]
 contents ディレクトリの index.html を index.php に書き換える

失敗しやすい記述例として、以下があります。RewriteBase が影響するのは RewriteRule のリダイレクト先のパスだけであるという点に注意して下さい。以下の例では、どのディレクトリの index.html にアクセスしても、/contents/index.php にリダイレクトされてしまいます。


# RewriteEngine を起動
RewriteEngine On

# RewriteBase でベースとなる URL を変更
RewriteBase /contents

# RewriteRule で index.php にリダイレクトする。
RewriteRule index.html index.php [R=301,L]
 contents ディレクトリの index.html を index.php に書き換える失敗例

RewriteRule ディレクティブ

RewriteRule ディレクティブは、URL の書き換えを行うディレクティブです。本ディレクティブを使用することで、URLを書き換えや、別のURLに移動(リダイレクト)させることでアクセスされたリソースに対してWebサーバの挙動を制御することができます。


本ディレクティブでは、条件に一致するURLを、後続の "置換文字列" で書き換えます。また、書き換え処理に関しては、挙動を制御するためのフラグがいくつか用意されており、柔軟な書き換えルールが定義できるようになっています。複数のフラグを指定する場合は、"," で区切って指定します。


# RewriteEngine を起動
RewriteEngine On

# RewriteRule 条件 置換文字列 [フラグ]
RewriteRule sample1.html sample2.html [L]
 sample1.html を sample2.html に書き換える
RewriteRule で利用可能なフラグ一覧
フラグシンタックス説明
B書き換え処理の前に英数字以外の文字をエスケープ(パーセントエンコーディング)します。
Cchain条件に一致したら、次の行に書かれた処理を連続して行います。これは通常の動作となるため、このフラグの用途は、条件が不一致の場合に後続の条件をスキップするために使われます。
CO=NAME:VALCookieCookie を設定することができます。
DPIdiscardpathURI の PATH_INFO を破棄します。このフラグは、Apache 2.2.12 以降で利用可能です。
EENV環境変数の値を設定することができます。値を設定する場合は [E=VAR:VAL]、値を削除する場合は [E=!VAL] とします。VAR は変数名、VAL は変数です。(例:[E=hoge:123])
FforbiddenHTTP 403(Forbidden:閲覧禁止)エラーを返します。以降のルールは実行しません。
GgoneHTTP 410(Gone:消滅)エラー※3を返します。以降のルールは実行しません。
H=Content-handlerHandler実行するアプリケーションのハンドラを強制的に指定します。例えば、拡張子のないファイルをすべて php アプリケーションとして実行するには、以下のように記述します。
RewriteRule !\. - [H=application/x-httpd-php]
LlastURLの書き換え処理を終了します。以降のルールは実行しません。
Nnext書き換え処理を先頭から再実行します。その際にマッチングされる URL は最後に書き換えられた URL となります。無限ループを引き起こさないように注意して下さい。
NCnocase条件を評価する時、英字の大文字小文字を区別しません。
NEnoescape&% をエスケープせずそのままの文字列として扱います。
NSnosubreqサーバ内部で発生するサブリクエストには、書き換え処理を行いません。
Pproxy強制的に置換対象部を内部的にプロキシリクエストとして、プロキシモジュールを通して出力します。置換文字列は、http:// から始まるようなプロキシモジュールで扱える有効な URI である必要があります。無効な URI を指定した場合は、エラーが返されます。ただし、このフラグを使用する場合は、mod_proxy が組み込まれている必要があります。
PTpassthroughRewriteRule ディレクティブのターゲット(または、置換文字列)は、ファイルパスを想定していますが、代わりに URI として処理を行います。Alias、Redirect、ScriptAlias ディレクティブを利用する際に指定します。
QSAqsappend書き換え前の URL と置換文字列に、それぞれクエリ文字列(URL の ? 以降の文字列)が存在する場合、置換文字列の末尾に & と書き換え前の URL に指定されたクエリ文字列を追加します。本フラグを指定しない場合、クエリ文字列は置換文字列で上書きされます。
R[=code]redirect指定したURLにリダイレクトします。[R=301] のようにレスポンスコードを指定することもできます。指定できるレスポンスコードの範囲は 300 ~ 399 までとなります。それ以外のレスポンスコードを指定した場合は、置換文字列が破棄されます。レスポンスコードを指定しない場合は 302(Found) になります。また、temp(デフォルト値)、permanentseeother のシンボル名も指定できます。
S=numskip指定した数のルールをスキップします。例えば、[S=2] と指定すると、条件に一致した場合、以降のルールを 2 つスキップします。
T=MIME-typetypeターゲットファイルを強制的に指定した MIME-type にします。

本ディレクティブの処理順は、先頭行から条件に一致する行を探索していきます。条件に一致した場合は、先頭行に戻り、再度条件に一致する行を探索します。例えば、下記の書き方では、index1.html にアクセスすると index2.html に書き換わった後、再度探索を行い最終的に index3.html に書き換わります。


# RewriteEngine On | Off
RewriteEngine On

# index1.html → index2.html → index3.html
RewriteRule index1.html index2.html
RewriteRule index2.html index3.html
 RewriteRule は条件に一致すると先頭行から再探索を行う

以下のような書き方では無限ループを引き起こし、500 internal server error が発生するため注意が必要です。特に RewriteRule では正規表現によるURL指定が可能であるため、意図せずに無限ループを引き起こすケースがあります。


# RewriteEngine On | Off
RewriteEngine On

# index1.html → index2.html → index1.html → ...
RewriteRule index1.html index2.html
RewriteRule index2.html index1.html
 無限ループする場合は 500 internal server error が発生する

上記のように無限ループを防ぐためには、[L] フラグを設定すればよいかと思うかもしれません。しかし、以下の例では index1.html にアクセスしても最終的には index3.html に書き換わってしまいます。


# RewriteEngine On | Off
RewriteEngine On

# index1.html → index2.html に書き換わった時点で終了しない
RewriteRule index1.html index2.html [L]
RewriteRule index2.html index3.html [L]
 最終的に index3.html に書き換わる

これは RewriteRule の機能を提供しているモジュール mod_rewrite の問題ですが .htaccess では [L] フラグが有効になりません。.htaccess の上位ファイルである httpd.conf では [L] フラグが正常に動作しますが .htaccess では再探索が優先されます。そのため、無限ループを防ぐには次章の "RewriteCond" を使用する方法が一般的です。

RewriteCond ディレクティブ

RewriteCond ディレクティブは、RewriteRule ディレクティブの書き換えルールの条件を定義できます。本ディレクティブは、RewriteRule ディレクティブの前に 1 つ以上設置することができます。複数設置する場合は、オプションによって OR 条件にするか選択できます。オプションを省略した場合は、AND 条件として処理されます。本ディレクティブの条件を満たした場合、直後の RewriteRule ディレクティブの書き換えが行われます。条件を満たさない場合は、直後の RewriteRule ディレクティブが実行されないため、無限ループを防ぐ方法として有効です。


# Rewriteエンジンを起動
RewriteEngine On

# RewriteCond テスト文字列 条件 オプション
RewriteCond %{HTTP_HOST} ^(www\.)?murashun\.sakura\.ne\.jp$ [NC]

# RewriteRule 条件 置換文字列 [フラグ]
RewriteRule .* http://murashun.jp%{REQUEST_URI} [R=301,L]
 sakura.ne.jp のドメインを murashun.jp に書き換える

RewriteRule と RewriteCond を組み合わせた処理順は、一般的な上から下に流れるプログラムとは異なります。基本的な処理順としては、以下になります。


  1. URL が 条件A にマッチし、かつ
  2. 文字列B が 条件C にマッチする場合
  3. URL を 文字列D に書き換える
RewriteCondの処理順
RewriteCondの処理順

プログラムで表現する場合は、以下になります。

if( URL =~ A && B =~ C){
  URL = D;
}
 RewriteRule と RewriteCond の処理順

A は URL を書き換えるかの条件であるため、文字列 A を 文字列 D で書き換えるということではありません。


RewriteCond で使用できるパターンとオプションは以下のとおりです。

条件に利用できるパターン
パターン説明
!テスト文字列が条件と不一致である場合、true を返す
<テスト文字列を数値、または辞書順として大小比較を行い小さい場合、true を返す
>テスト文字列を数値、または辞書順として大小比較を行い大きい場合、true を返す
=テスト文字列を数値、または辞書順として等価比較を行い等しい場合、true を返す
-dテスト文字列のディレクトリが存在する場合、true を返す
-fテスト文字列のファイルが存在する場合、true を返す
-sテスト文字列のファイルが存在し、サイズが0byteでない場合、true を返す
-lテスト文字列がシンボリックリンクである場合、true を返す
-xテスト文字列に対して実行権限がある場合、true を返す
-Fテスト文字列に対してアクセス可能なパスである場合、true を返す
-Uテスト文字列に対してアクセス可能なURLである場合、true を返す
条件を評価する時のオプション
オプション説明
[OR]連続する RewriteCond のいずれかが true の場合に実行する。
省略時は、連続する RewriteCond がすべて true の場合に実行する。
[NC]条件を評価する時、大文字小文字を区別しない。

RewriteOptions ディレクティブ

RewriteOptions ディレクティブは、サーバ単位、またはディレクトリ単位にオプションを設定できます。指定できるオプションの文字列と効果は以下の通りです。

RewriteOptions ディレクティブに指定可能な値
説明
inherit上位ディレクトリの設定の継承が強制されるため、上位ディレクトリの設定が下位ディレクトリより優先して実行されます。
AllowAnyURIどのような URI も書き換えることが可能になります。mod_rewrite の脆弱性の修正を行ったことで発生した互換性の問題を回避するためのオプションです。特別な事情がない限り、使用することは非推奨です。
MergeBaseRewriteBaseの設定が下位ディレクトリにも継承されます。

HTTP環境変数

ブラウザでサーバにアクセスする際、HTTPリクエストヘッダに各種の情報を含めて送信しています。HTTPリクエストヘッダの情報は "%{環境変数名}" と指定することで RewriteCond で利用することができます。

RewriteCond で利用できる HTTP 環境変数
グループ環境変数名
ヘッダ環境変数
HTTP headers
HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT
サーバー環境変数
server internals
DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE
リクエスト環境変数
connection & request
REMOTE_ADDR, REMOTE_HOST, REMOTE_PORT, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE
システム日付・時刻変数
date and time
TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME
その他
specials
API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME, IS_SUBREQ, HTTPS

ヘッダ環境変数 - HTTP headers

HTTP_USER_AGENT

HTTP_USER_AGENT は、クライアントのプラットフォーム、バージョン情報、ブラウザの情報が含まれます。以下は、HTTP_USER_AGENT の一例です。


# Windows - Internet Explorer
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
 HTTP_USER_AGENT の一例

プラットフォームやブラウザの種類やバージョンによって情報が異なるため、指定漏れがないように注意が必要です。特定のプラットフォームやブラウザのバージョンを問わず指定する場合は "Windows" や "Chrome" などの文字列を指定する必要があります。ただし、HTTP_USER_AGENT はクライアント側が設定する情報であり、ブラウザのプラグインなどにより詐称が可能です。また、各サイトを巡回してページ情報を収集する "クローラー" も HTTP_USER_AGENT を使用している場合があります。


# Rewriteエンジンを起動
RewriteEngine On

# HTTP_USER_AGENT に iPhone が含まれる場合、iPhone 用のページにリダイレクトする。
RewriteCond %{HTTP_USER_AGENT} iPhone [NC]
RewriteRule ^(.*)$ iphone/$1 [R,L]
 iPhone 専用ページにリダイレクトする例

HTTP_REFERER

HTTP_USER_AGENT は、参照元の URL 情報が含まれます。例えば、Google の検索結果画面から訪れた場合は、Google の URL 情報が含まれています。ただし、ダイレクトアクセスなどで訪れた場合は、情報が含まれないケースがあります。以下は、HTTP_USER_AGENT の一例です。


# Google の検索結果から訪れた場合
https://www.google.co.jp/
 HTTP_REFERER の一例
# Rewriteエンジンを起動
RewriteEngine On

# murashun.jp ドメイン以外からの画像のリンクは許可しない
RewriteCond %{HTTP_REFERER} !^http://(www\.)?murashun.jp [NC]
RewriteRule \.png$ - [F]
 画像の Hotlink (直接リンク) に対して403エラーを返す例

HTTP_COOKIE

HTTP_COOKIE は、Cookie 情報が含まれます。Cookie は名前と値がセットになっていて、変数には両方が格納されています。また、Cookie は一部の文字がエンコードされているため指定の際には注意しましょう。


# Cookie名 = Cookie値; ... で参照される
name=murashun; id=123456; date=2015%2F02%2F05;
 HTTP_COOKIE の一例

# Rewriteエンジンを起動
RewriteEngine On

# Cookie の id が数字6桁でない場合は403エラー
RewriteCond %{HTTP_COOKIE} !id=[0-9]{6}
RewriteRule ^(.*)$ - [F]
 Cookie manipulation attack に対する防御例

HTTP_FORWARDED

HTTP_FORWARDED は、経由したプロキシの種類やバージョン情報が含まれます。ただし、プロキシサーバを経由していない場合は、情報が含まれないケースがあります。


# 経由したプロキシの種類やバージョン情報
by http://ProxyServer:8080/ (Squid/1.0.20) for 10.20.30.40
 HTTP_FORWARDED の一例

# Rewriteエンジンを起動
RewriteEngine On

# プロキシサーバを経由した場合403エラー
RewriteCond %{HTTP_FORWARDED} !^$
RewriteRule ^(.*)$ - [F]
 プロキシサーバを経由の閲覧を許可しない例

HTTP_HOST

HTTP_HOST は、リクエスト先のホスト名 (DNS 名) 情報が含まれます。


# 接続先ホスト名
murashun.jp:80
 HTTP_HOST の一例

# Rewriteエンジンを起動
RewriteEngine On

# URL の www を省略する
RewriteCond %{HTTP_HOST} ^www\.murashun\.jp
RewriteRule ^(.*)$ https://murashun.jp/$1 [R,L]
 URL の www を省略する例

HTTP_PROXY_CONNECTION

HTTP_PROXY_CONNECTION は、プロキシの接続情報が含まれます。プロキシサーバを経由する時、クライアントからのヘッダ情報をそのままサーバに渡す "End-to-End" 方式か、ヘッダ情報を変化させて渡す "Hop-by-Hop" 方式の2種類あります。HTTP_USER_AGENT などはクライアントの情報がそのままサーバに渡される End-to-End 方式ですが、HTTP_PROXY_CONNECTION はプロキシサーバの情報が渡される Hop by Hop 方式です。


# プロキシの接続情報
"", keep-alive, close など
 HTTP_PROXY_CONNECTION の値

HTTP_ACCEPT

HTTP_ACCEPT は、ブラウザがサポートするメディア・MIMEタイプ情報が含まれます。例えば、ブラウザが HTML をサポートする場合は "text/html" と表記されます。"*/*" は表記以外すべてのメディアを示します。また、サポートするメディアには ; に続けて "品質値" を書くことで優先度を定義できます。品質値を省略した場合は "1" になります。


# ブラウザのサポート形式
text/html,application/xhtml+xml,*/*;q=0.5
 HTTP_ACCEPT の値

# Rewriteエンジンを起動
RewriteEngine On

# HTMLをサポートしていない場合は403エラー
RewriteCond %{HTTP_ACCEPT} !text/html [NC]
RewriteRule ^(.*)$ - [F]
 HTMLをサポートしていない場合に403エラーを返す例

サーバー環境変数 - server internals

DOCUMENT_ROOT

DOCUMENT_ROOT は、Web サーバの公開ディレクトリまでのパス情報が含まれます。例えば、さくらインターネットの場合は /home/murashun/www 配下が公開ディレクトリとなるため、"/home/murashun/www" が格納されます。サーバによっては public_html ディレクトリなど名前やパスが異なる場合があります。


# Rewriteエンジンを起動
RewriteEngine On

# リクエストされたファイルがアーカイブのディレクトリにあるか確認
RewriteCond %{REQUEST_URI} ^(.*\.html)$
RewriteCond %{DOCUMENT_ROOT}/archive/%1 -f

# アーカイブのディレクトリにあれば書き換える
RewriteRule ^(.*)$ /archive/%1 [L]
 他のディレクトリからファイルを探す例

SERVER_ADMIN

SERVER_ADMIN は、Web サーバの設定で指定された管理者のメールアドレス情報が含まれます。Web サイトの管理者ではなく、Web サーバの管理者のメールアドレスであることに注意して下さい。SERVER_ADMIN に格納されている値は、httpd.conf の ServerAdmin ディレクティブに設定された値が返されます。また、メールアドレスではなく URL が設定されている場合もあります。例えば、さくらインターネットの場合は、"support@sakura.ad.jp" が格納されています。


# Web サーバ管理者のメールアドレス
admin@your-domain.com
 SERVER_ADMIN の値

SERVER_NAME

SERVER_NAME は、Webサーバ名の情報が含まれます。SERVER_NAME は HTTP_HOST と似ているため注意が必要です。SERVER_NAME は httpd.conf の ServerName ディレクティブに設定された値を返します。HTTP_HOST は リクエストの HTTP ヘッダ情報に含まれるホスト名を返します。ただし、ServerName が指定されていないときは、サーバは IP アドレスから逆引きを行いホスト名を探します。例えば、さくらインターネットの場合は、"murashun.jp" が格納されています。


# ServerName の定義値
hoge.sakura.ne.jp
 SERVER_NAME の一例

SERVER_ADDR

SERVER_ADDR は、Web サーバの IP アドレス情報が含まれます。


# サーバの IP アドレス
10.20.30.40:80
 SERVER_ADDR の一例

SERVER_PORT

SERVER_PORT は、Webサーバのポート番号の情報が含まれます。ポート番号から http か https か判断することができます。一般的には、http は 80、https は 443 が割り当てられます。


# Rewriteエンジンを起動
RewriteEngine On

# ポート番号が80ならhttp, 443ならhttpsに書き換える 
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R,L]
RewriteCond %{SERVER_PORT} ^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
 ポート番号からプロトコルを変更する例

SERVER_PROTOCOL

SERVER_PROTOCOL は、プロトコル名やバージョンの情報が含まれます。


# サーバプロトコル情報
HTTP/1.1
 SERVER_PROTOCOL の一例

SERVER_SOFTWARE

SERVER_SOFTWARE は、Webサーバのソフトウェア名、およびバージョン情報が含まれます。


# さくらのレンタルサーバの例 (2015年9月時点)
Apache/2.2.29
 SERVER_SOFTWARE の一例

リクエスト環境変数 - connection & request

REMOTE_ADDR

REMOTE_ADDR は、クライアントの IP アドレス情報が含まれます。


# クライアントの IP アドレス
10.20.30.40:80
 REMOTE_ADDR の一例

REMOTE_HOST

REMOTE_HOST は、クライアントのホスト名情報が含まれます。ただし、必ず情報が含まれているとは限りません。情報が含まれていない場合は、IPアドレスから逆引き参照を行います。


# クライアントのホスト名
client123.hoge.ne.jp
 REMOTE_HOST の一例

REMOTE_PORT

REMOTE_PORT は、クライアントのポート番号の情報が含まれます。

REMOTE_USER

REMOTE_USER は、Basic 認証におけるユーザ認証時のユーザ ID 情報が含まれます。


# htpasswd murashun:hoge123
murashun
 REMOTE_USER の一例

REMOTE_IDENT

REMOTE_IDENT は、リクエストを発行したユーザ情報が含まれます。ただし、ユーザ情報は Unix の ident daemon により通知されるため、Windows を使用しているユーザからは通知されません。大抵の場合は、値が入っていません。

REQUEST_METHOD

REQUEST_METHOD は、"GET" または "POST" の HTTP リクエスト情報が含まれます。


# Rewriteエンジンを起動
RewriteEngine On

# HTTPリクエストによって振り分ける
RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^(.*)$ /foo/$1 [R,L]
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*)$ /bar/$1 [R,L]
 REQUEST_METHOD を使って URL を書き換える例

SCRIPT_FILENAME

実行するスクリプトの絶対パス情報が含まれます。


# Rewriteエンジンを起動
RewriteEngine On

# 実行ファイルが存在しない場合、エラー画面を表示する
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ /error.html [NC,L]
 SCRIPT_FILENAME を使ってURLを書き換える例

PATH_INFO

PATH_INFO は、ファイル名とクエリー文字列の間にあるパス情報が含まれます。後述するAcceptPathInfo ディレクティブも参考にして下さい。


# hoge.php/foo/bar?id=123456
/foo/bar
 PATH_INFO の一例

QUERY_STRING

QUERY_STRING は、クエリー文字列である GET パラメータの情報が含まれます。QUERY_STRING の中に URI で使用できない文字列が含まれる場合は、パーセントエンコードされます。パーセントエンコードなしの文字列を取得する場合は、QUERY_STRING_UNESCAPED を使用します。ただし、QUERY_STRING_UNESCAPED も Unix シェルのメタ文字は \ でエスケープされます。


# hoge.php/foo/bar?id=123456
id=123456
 QUERY_STRING の一例

AUTH_TYPE

AUTH_TYPE は、ユーザの認証方式の情報が含まれます。

システム日付・時刻変数 - date and time

TIME_YEAR

TIME_YEAR は、サーバ時刻の年の情報が含まれます。


# Rewriteエンジンを起動
RewriteEngine On

# 期間限定のページを開設する例
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} > 20150101
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} < 20150102
RewriteRule ^(.*)$ /HappyNewYear.html [L] 
 年月日を指定して期間限定のページにリダイレクトする例

TIME_MON

TIME_MON は、サーバ時刻の月の情報が含まれます。

TIME_DAY

TIME_DAY は、サーバ時刻の日の情報が含まれます。

TIME_HOUR

TIME_HOUR は、サーバ時刻の時の情報が含まれます。

TIME_MIN

TIME_MIN は、サーバ時刻の分の情報が含まれます。

TIME_SEC

TIME_SEC は、サーバ時刻の秒の情報が含まれます。

TIME_WDAY

TIME_WDAY は、サーバ時刻の曜日の情報が含まれます。曜日は0(日曜)~6(土曜)の範囲で表します。

TIME

TIME は、サーバ時刻の年・月・日・時・分・秒の情報が含まれます。

その他 - specials

API_VERSION

API_VERSION は、Webサーバプログラムのバージョンの情報が含まれます。


# HTTPD 2.2.x は 20051115:XX で表されます
20051115:33
 API_VERSION の一例

THE_REQUEST

THE_REQUEST は、リクエストの情報が含まれます。


# index.html に HTTP ver1.1 でリクエスト例
GET /index.html HTTP/1.1
 THE_REQUEST の一例

REQUEST_URI

REQUEST_URI は、リクエストされたURI情報が含まれます。


# 本記事の URI 情報
/blog/20141229-01.html
 REQUEST_URI の一例

REQUEST_FILENAME

REQUEST_FILENAME は、リクエストされたサーバパス情報が含まれます。


# さくらインターネットのレンタルサーバでの例
/home/murashun/www/blog/20141229-01.html
 REQUEST_FILENAME の一例

IS_SUBREQ

IS_SUBREQ は、サブリクエストを処理中は true、そうでなければ false を返します。

HTTPS

HTTPS は、HTTP通信であれば on、そうでなければ off を返します。

後方参照

後方参照とは、正規表現の "(" , ")" に囲まれた条件にマッチングした文字列を "後方" で "参照" できる方式です。以下の例は、マッチングした文字列を "$1" で参照しています。


# Rewriteエンジンを起動
RewriteEngine On

# URLからwwwは取り除くが、ディレクトリ名やファイル名は後方参照で使いまわす
RewriteCond %{HTTP_HOST} ^www\.murashun\.jp
RewriteRule ^(.*)$ https://murashun.jp/$1 [R=301,L]
 後方参照を利用してURLを正規化する

RewriteRuleの後方参照

RewriteRule で後方参照を利用する場合は "$n" で表記します。( n には 0 ~ 9 の数字が入ります。)後方参照は、複数の条件がある場合でも利用できます。マッチング条件が複数ある場合は、左側から $1, $2 というように、どの条件にマッチングした文字列を参照するか選択することができます。ただし、$0$1 は同じ値を示します。また、10 を超える後方参照は使用できません。$10 と記述しても "$1""0" の文字列として認識されます。


# Rewriteエンジンを起動
RewriteEngine On

# /blog/foo/bar → /foo/bar に変換される
RewriteRule ^/blog/(.*)/(.*)$ /$1/$2
#                   $1   $2
 RewriteRuleにおける後方参照

RewriteCondの後方参照

 RewriteCond で後方参照を利用する場合は "%n" で表記します。( n には 1 ~ 9 の数字が入ります。)表記する記号が RewriteRule と異なり % であることと、%0 は使えないことに注意して下さい。その他の使い方は RewriteRule と同様です。


# Rewriteエンジンを起動
RewriteEngine On

#                                 %1   %2
RewriteCond %{REQUEST_FILENAME} ^(.*)/(.*)/index.html$
RewriteRule ^/blog/(.*)/(.*)$ /$1/%1/$2/%2
#                   $1   $2
 RewriteCondにおける後方参照

まとめ

.htaccess を使って実現できることは非常に多くあります。独自の構文を組み上げてオリジナルの黒魔術を完成させることも一興ですが、代々伝わる使い古されたレシピを使うことをおすすめします。深みにはまってダークサイドに堕ちないように気をつけて下さい。


代表的なレシピは.htaccess の設定レシピ集を参照して下さい。