Movatterモバイル変換


[0]ホーム

URL:


モジュール |ディレクティブ |FAQ |用語 |サイトマップ

Apache HTTP サーバ バージョン 2.4

<-
Apache >HTTP サーバ >ドキュメンテーション >バージョン 2.4

セクションの設定

翻訳済み言語: en  | fr  | ja  | ko  | tr 

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

設定ファイル中のディレクティブはサーバ全体に適用されたり、特定のディレクトリやファイル、ホスト、URL にのみ適用されるように制限したりすることができます。この文書は設定用のセクションのコンテナや.htaccess ファイルを使って他の設定ディレクティブのスコープを変更する方法を説明します。

Support Apache!

参照

top

設定用セクションコンテナの種類

関連モジュール関連ディレクティブ

コンテナには二つの基本となる種類があります。ほとんどのコンテナは各リクエストに対して評価されます。その場合、コンテナ中のディレクティブはコンテナにマッチするリクエストにのみ適用されます。一方、<IfDefine>,<IfModule>,<IfVersion>コンテナはサーバの起動時と再起動時にのみ評価されます。起動時に条件が真であれば、コンテナ中のディレクティブはすべてのリクエストに適用されます。条件が偽であれば、コンテナ中のディレクティブは無視されます。

<IfDefine> ディレクティブはhttpd コマンドラインで適切なパラメータが定義されたときにのみ適用されるディレクティブを囲います。例えば次の設定では、サーバがhttpd -DClosedForNow を使って起動されたときだけすべてのリクエストを別のサイトにリダイレクトします:

<IfDefine ClosedForNow>
Redirect / http://otherserver.example.com/
</IfDefine>

<IfModule> は非常に似ていますが、代わりにサーバ上でモジュールが使用可能な場合にのみ適用可能なディレクティブを囲います。モジュールはサーバに静的に組み込まれているか、動的に組み込むようになっていて、設定ファイル中でLoadModule の行がより前の部分に書かれている必要があります。このディレクティブは特定のモジュールの存在に関わらず設定ファイルが動作する必要がある場合にのみ使ってください。常に動作して欲しいディレクティブを囲むために使うべきではありません。存在しないモジュールに関する有用なエラーメッセージの発生を抑制してしまいますので。

次の例では、mod_mime_magic があるときにのみMimeMagicFiles ディレクティブが適用されます。

<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
</IfModule>

<IfVersion>ディレクティブは<IfDefine><IfModule>と、とてもよく似ていますが、稼働中のサーバのバージョンが特定のバージョンの時にのみ適用されます。様々なバージョンの httpd を様々な設定で動作させることになる場合で、テストスイートや巨大なネットワークでの用途を想定して、このモジュールは設計されています。

<IfVersion >= 2.1>
# this happens only in versions greater or
# equal 2.1.0.
</IfVersion>

<IfDefine>,<IfModule>,<IfVersion> ディレクティブはテストの前に "!" を付けることで否定の条件を適用することができます。また、これらのセクションはより複雑な制限を課すために入れ子にすることができます。

top

ファイルシステムとウェブ空間

最もよく使われる設定のセクションコンテナはファイルシステムやウェブ空間の特定の場所の設定を変更するものです。まず、この二つの違いを理解することが大切です。ファイルシステムはオペレーティングシステムから見たディスクの内容です。たとえば、デフォルトのインストールでは Apache は Unix ファイルシステムでは/usr/local/apache2 に、Windows ファイルシステムでは"c:/Program Files/Apache Group/Apache2" に存在します。(Apache では Windows でもパスセパレータとしてスラッシュを使うことに気をつけてください。) 対照的に、ウェブ空間はあなたのサイトをウェブサーバから配信されるものとして見たもので、クライアントに見えるものです。デフォルトの Unix 上の Apache のインストールではウェブ空間の/dir/ というパスはファイルシステムの/usr/local/apache2/htdocs/dir/ というパスに対応します。ウェブページはデータベースや他の場所から動的に生成することもできますので、ウェブ空間はファイルシステムに直接マップする必要はありません。

ファイルシステムコンテナ

<Directory> ディレクティブと<Files> ディレクティブ、それとそれらの正規表現版はディレクティブをファイルシステムの一部分に対して適用します。<Directory> セクションの中のディレクティブは指定されたディレクトリとそのすべてのサブディレクトリに適用されます。.htaccess ファイルを使うことでも同じ効果を得ることができます。例えば、次の設定では/var/web/dir1 とすべてのサブディレクトリに対してディレクトリインデックスを行ないます。

<Directory /var/web/dir1>
Options +Indexes
</Directory>

<Files> セクションの中にあるディレクティブはどのディレクトリにあるかに関わらず、指定された名前のすべてのファイルに適用されます。ですから例えば以下の設定ディレクティブが設定ファイルの主セクションに書かれたときには、すべての場所のprivate.html という名前のファイルへのアクセスを拒否します。

<Files private.html>
Order allow,deny
Deny from all
</Files>

ファイルシステムの特定の場所にあるファイルを指定するために、<Files> セクションと<Directory> セクションを組み合わせることができます。例えば、次の設定では/var/web/dir1/private.html,/var/web/dir1/subdir2/private.html,/var/web/dir1/subdir3/private.html など、/var/web/dir1/ ディレクトリの下にあるすべてのprivate.html へのアクセスを拒否します。

<Directory /var/web/dir1>
<Files private.html>
Order allow,deny
Deny from all
</Files>
</Directory>

ウェブ空間コンテナ

一方、<Location>ディレクティブとその正規表現版はウェブ空間上の内容に対して設定を変更します。たとえば、次の設定では /private で始まる URL パスへのアクセスを制限します。具体的には、http://yoursite.example.com/private,http://yoursite.example.com/private123,http://yoursite.example.com/private/dir/file.html へのリクエストや、他の同様に/private 文字列で始まるリクエストに適用されます。

<Location /private>
Order Allow,Deny
Deny from all
</Location>

<Location>ディレクティブはファイルシステムと関係ある必要が全くありません。たとえば次の例では、どのようにして特定の URL をmod_statusで提供されている Apache 内部ハンドラにマップするかを示しています。ファイルシステムにserver-status というファイルが存在する必要はありません。

<Location /server-status>
SetHandler server-status
</Location>

ワイルドカードと正規表現

<Directory>,<Files>,<Location> ディレクティブでは、 C 標準ライブラリのfnmatch のようにshell スタイルのワイルドカードキャラクタが使用できます。"*" 文字は任意の文字列にマッチし、"?" 文字は任意の 1 文字にマッチし、"[seq]" はseq の任意の文字にマッチします。"/" 文字はどのワイルドカードでもマッチされません。明示的に指定する必要があります。

これより柔軟なマッチングが必要な場合は、これらのコンテナに正規表現(regex) 版である<DirectoryMatch>,<FilesMatch>,<LocationMatch>があり、マッチを選択するのに perl 互換正規表現を使用できます。しかし、次の設定のマージに目を通して、regex セクションを使用することで、ディレクティブの適用がどのように変化するか把握しておいてください。

全ユーザディレクトリの設定を変更する、非 regexワイルドカードセクションは次のようになります。

<Directory /home/*/public_html>
Options Indexes
</Directory>

regex セクションを使用することで、画像ファイルの多くのタイプに対するアクセスを一度に拒否できます。

<FilesMatch \.(?i:gif|jpe?g|png)$>
Order allow,deny
Deny from all
</FilesMatch>

いつ何を使うか

ファイルシステムコンテナとウェブ空間コンテナを使い分けるのは、実際には非常に簡単です。ファイルシステムに依存するオブジェクトにディレクティブを適応する場合は、必ず<Directory><Files>を使用します。ファイルシステムに依存しないオブジェクト(データベースから生成されるウェブページなど) にディレクティブを適用する際には、<Location>を使用します。

ファイルシステム上のオブジェクトへのアクセスを制限するために、<Location>を決して使用ないようにしましょう。同一のファイルシステム位置にマップしている、ウェブ空間位置 (URL)が多数あって、設定した制限を迂回されてしまうかもしれないからです。例えば次の設定を考えてみましょう。

<Location /dir/>
Order allow,deny
Deny from all
</Location>

http://yoursite.example.com/dir/へのリクエストでは上手く動作します。しかし大文字小文字を区別しないファイルシステムを使っていたらどうなるでしょう?http://yoursite.example.com/DIR/ へのリクエストで簡単にアクセス制限を迂回されてしまいます。これに対して<Directory>ディレクティブを使用すると、どのように呼び出されたかに関わらずその場所から提供される内容に適用されます。(例外はファイルシステムのリンクです。シンボリックリンクを使って、同一のディレクトリを複数のファイルシステムに設置できます。<Directory>ディレクティブはパス名をリセットすることなくシンボリックリンクを辿ります。ですから、高度なセキュリティが要求される場合は、適切にOptions ディレクティブを使用してシンボリックリンクを無効にするべきです。)

大文字小文字を区別するファイルシステムを使用しているから上記のことは無関係だと思われるかもしれませんが、同一のファイルシステム位置に複数のウェブ空間位置をマップする方法は、他にいくらでもあるということを覚えていてください。ですからできる限りファイルシステムコンテナを使用してください。しかしながら一つだけ例外があります。<Location /> セクションはどんな URL にも関わらず適用されるので、完全に安全です。

top

バーチャルホスト

<VirtualHost>コンテナは特定のホストに適用するディレクティブを格納します。一台のマシンで複数のホストを異なる設定で提供したいときに有用です。詳細に関してはバーチャルホストドキュメントをご覧下さい。

top

プロクシ

<Proxy><ProxyMatch>コンテナは、特定の URL にマッチするmod_proxyプロクシサーバを経由してアクセスしたサイトに対してのみ適用される設定ディレクティブを格納します。例えば次の設定は、cnn.com ウェブサイトにアクセスするために用いられるプロクシサーバを制限します。

<Proxy http://cnn.com/*>
Order allow,deny
Deny from all
</Proxy>

top

どのディレクティブが使えるの?

どのタイプの設定セクションでどのディレクティブが使用できるかは、ディレクティブのContextを見てください。<Directory>で使用可能なものは全て、同様に<DirectoryMatch>,<Files>,<FilesMatch>,<Location>,<LocationMatch>,<Proxy>,<ProxyMatch>セクションで使用可能です。しかしながら幾つか例外も存在します。

top

セクションのマージ方法

マージの順番は以下のようになっています:

  1. <Directory> (正規表現無し) と.htaccess を同時に (.htaccess が許可されていれば、それが<Directory> を上書きします)
  2. <DirectoryMatch> (と<Directory ~>
  3. <Files><FilesMatch> を同時に
  4. <Location><LocationMatch> を同時に

<Directory> 以外は、それぞれのグループは設定ファイルに現れた順番に処理されます。<Directory> (上のグループ 1) はディレクトリが短いものから長いものへと処理されます。ですから、 例えば<Directory /var/web/dir1><Directory /var/web/dir/subdir> の前に処理されます。複数の<Directory> セクションが 同じディレクトリに 適用される場合は、設定ファイル中の順番に従って処理されます。Include によって挿入された設定は 挿入しているファイルのInclude ディレクティブの位置にあったかのように扱われます。

<VirtualHost> セクション中のセクションは バーチャルホストの定義の外側の対応するセクションのに適用されます。これによりバーチャルホストが メインのサーバ設定を上書きできるようなります。

mod_proxy でリクエストが処理される場合は、 処理順番のうち、<Directory> コンテナの部分が<Proxy> コンテナに取って代わられます。

後のセクションのディレクティブが前のセクションのものを上書きします。

技術メモ

実際には、名前を変換する段階 (URL をファイル名にマップするためにAliasDocumentRoot が使用されるところ) の直前に<Location>/<LocationMatch> が行なわれます。 これらを適用した結果は変換が終わった後に完全に捨てられます。

次はマージの順番を示すための恣意的な例になっています。リクエスト全てに適用されるとして、本例のディレクティブはA > B > C > D > E の順番に適用されます。

<Location />
E
</Location>

<Files f.html>
D
</Files>

<VirtualHost *>
<Directory /a/b>
B
</Directory>
</VirtualHost>

<DirectoryMatch "^.*b$">
C
</DirectoryMatch>

<Directory /a/b>
A
</Directory>

もっと具体的な、次の例を考えてみましょう。<Directory> セクションに設置されたアクセス制限に関わらず、<Location>セクションが最後に評価されて、サーバへのアクセスは制限されません。言い換えれば、マージの順番は重要で、注意して使用してください!

<Location />
Order deny,allow
Allow from all
</Location>

# Woops! This <Directory> section will have no effect
<Directory />
Order allow,deny
Allow from all
Deny from badguy.example.com
</Directory>

翻訳済み言語: en  | fr  | ja  | ko  | tr 

top

コメント

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to ourmailing lists.

Copyright 2025 The Apache Software Foundation.
この文書はApache License, Version 2.0 のライセンスで提供されています。.

モジュール |ディレクティブ |FAQ |用語 |サイトマップ


[8]ページ先頭

©2009-2025 Movatter.jp