apacheの設定ファイル基礎 自己解釈


# 概要
公式の[「設定ファイル」のページ](http://httpd.apache.org/docs/current/configuring.html)と[「セクションの設定」ページ](http://httpd.apache.org/docs/current/sections.html)の自己解釈です。    
基本的に、[Apache HTTP サーバ バージョン current ドキュメント](http://httpd.apache.org/docs/current/)をFacadeとして、ここから追う。

# 用語

[ディレクティブの解説に使われる用語](http://httpd.apache.org/docs/current/mod/directive-dict.html)を参照してくれ。  

# 基本

## 「逐次」と「分岐」で成り立つ、構造化プログラミング的なナニカ
「繰り返し」は、「アクセスごと」に行われる、と思っとけば、「繰り返し に制限のある構造化プログラミング」と捉えられる。  
サーバデーモンの（再）起動時に設定ファイルをコンパイルして、アクセスごとに処理する感じ。

## 文法
設定ファイルの文法まとめ。

* 1行に1ディレクティブ（設定）。スクリプト言語的な感じ。
* シェルスクリプトと同じ感じで、「行末に"\"（バックスラッシュ）」で1ディレクティブを複数行にわたって記述できる。
    * バックスラッシュと改行コード間に、空欄とか文字とかがあったらダメ。
* 関数名は、大小文字を区別しないが、引数の文字列では区別する。（区別しないディレクティブもある。）
* ハッシュ文字"#"で**始まる行**は、コメントになる。
    * ディレクティブの行末とかにコメントを書くことはできない。
* 空行は無視される。
* インデントそのものは意味を持たないので、自由にインデントできる。
    * リーダブルコードに則って、インデントすべき。
* 設定ファイルのLintは、`apachectl -t` できる。

## モジュール化されたサーバ

> Apacheはモジュール化されたサーバです。コアサーバには最も基本的な機能だけが含まれています。

だそうです。

## コンパイル、プリプロセス
以下のディレクティブは、コンパイル時に処理される。（C言語のプリプロセス的な感じ。）

* [IfDefine _[!]parameter-name_](http://httpd.apache.org/docs/current/mod/core.html#ifdefine)
* [IfModule _[!]module_file or module-identifier_](http://httpd.apache.org/docs/current/mod/core.html#ifmodule)
* [IfVersin _[operator]_ _version_](http://httpd.apache.org/docs/current/mod/mod_version.html#ifversion)

コンパイル時に偽になったら、常に無視されるようになる。コンパイル時に最適化で消し去ったりしないのかな。  


## 分岐（セクション）
とりあえず、[セクションの設定](http://httpd.apache.org/docs/current/sections.html)を参照する。  
[ファイルシステムとウェブ空間](http://httpd.apache.org/docs/current/sections.html#file-and-web)とかも重要。

### 「ディレクトリ」セクション

* [Directory _direcotry-path_](http://httpd.apache.org/docs/current/mod/core.html#directory)
* [DirectoryMatch _regex_](http://httpd.apache.org/docs/current/mod/core.html#directorymatch)
* [If _expression_](http://httpd.apache.org/docs/current/mod/core.html#if)
* [ElseIf _expression_](http://httpd.apache.org/docs/current/mod/core.html#elseif)
* [Else](http://httpd.apache.org/docs/current/mod/core.html#else)
* [Files _filename_](http://httpd.apache.org/docs/current/mod/core.html#files)
* [FilesMatch _regex_](http://httpd.apache.org/docs/current/mod/core.html#filesmatch)

### 「[バーチャルホスト](http://httpd.apache.org/docs/current/vhosts/)」セクション

* [VirtualHost _addr[:port] ..._](http://httpd.apache.org/docs/current/mod/core.html#virtualhost)

## 逐次（処理の順番）
以下の順番で、マージされていく。同じディレクティブがある場合は、より後に実行されたほうが優先される。（上書きされていく。）  
ただし、優先度がある。CSSの詳細度みたいな感じ。CSSの詳細度と同じノリで定義してみる。優先度が高いやつほど、あとから適用される。（より優先度が高いやつで上書きするように処理する。）

1. Location と LocationMatch セクションなら1
1. Files と FilesMatchセクションなら1
1. 正規表現を使ったDirectoryセクションでのパスの深さ
1. .htaccess（Directoryセクション風に使うので。）なら1
1. Directoryセクション（or Proxyセクション）での、パスの深さ。（正規表現を使うと、DirectoryMatchセクション扱いになる。）
1. バーチャルホストなら1、違う（メインサーバ）なら0。


**例**
 以下の設定は、A→B→C→D→E の順で評価される（上書きしていく）。結果、Eで書いた奴が一番優先される。  
 `#XXXXXX` は、CSSで言う詳細度。

```apache

<Location />
  #100000
  E
</Location>


<Files f.html>
  # 010000
  D
</Files>

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

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


<Directory /a/b>
  # 000020
  A
</Directory>
```

## 環境変数
[Apache の環境変数](http://httpd.apache.org/docs/current/env.html)を参照する。

# やばそうなやつ
[「設定ファイルなのにチューリング完全にしちゃった（てへぺろ）」](http://cpplover.blogspot.jp/2013/10/blog-post_20.html)とか、[「Webサーバだと思ったら、（大体）CGIだった」](http://httpd.apache.org/docs/current/howto/ssi.html)とか。

## セクション

* [authnprovideralias _base-provider Alias_](http://httpd.apache.org/docs/current/mod/mod_authn_core.html#authnprovideralias)
* [AuthzProviderAlias _baseProvider Alias Require-Parameters_](http://httpd.apache.org/docs/current/mod/mod_authz_core.html#authzprovideralias)
* [Location _URL-path_](http://httpd.apache.org/docs/current/mod/core.html#location) → セキュリティ的に危ない&むずいから非推奨なやつ。
* [LocationMatch _regex_](http://httpd.apache.org/docs/current/mod/core.html#locationmatch) → セキュリティ的に危ない&むずいから非推奨なやつ。
* [Limit _method ..._](http://httpd.apache.org/docs/current/mod/core.html#limit) → 非推奨。LimitExceptを使ったほうがいい。
* [LimitExcept _method ..._](http://httpd.apache.org/docs/current/mod/core.html#limitexcept)
* [macor _name [par1 .. parN]_](http://httpd.apache.org/docs/current/mod/mod_macro.html#macro)
* [Proxy _wildcard-url_](http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxy) → セキュリティ的に危ない。
* [ProxyMatch _regexl_](http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxymatch) セキュリティ的に危ない。
* [RequireAll](http://httpd.apache.org/docs/current/mod/mod_authz_core.html#requireall) 
* [RequireAny](http://httpd.apache.org/docs/current/mod/mod_authz_core.html#requireany)
* [RequireNone](http://httpd.apache.org/docs/current/mod/mod_authz_core.html#requirenone)