Apache 設定例
- 起動
- 設定例
- phpファイルをテキストで表示
- 強制的にphpとして実行
- .htaccessを許可/禁止する
- ディレクトリアクセスしたときにindex.htmlを表示する
- DocumentRootのディレクトリ以外を公開したい
- ディレクトリアクセスしたときに中身を表示しない
- シンボリックリンクをたどるのを許可する
- hogeをリクエストしてhogeがなければhoge.*を表示するようにする
- Basic認証をかける
- 他の設定ファイルを読み込む
- phpファイルだけに適用させる
- IP直打ちの場合は別のVirtualHostを表示したい
- キャッシュクリア
- 画像等不要なファイルはアクセスログを取らないようにする
- アクセスログを日別に記録する
- アクセスログに情報を追加する (PHP)
- Basic認証
- メモ
モジュールのマニュアル
http://httpd.apache.org/docs/2.2/ja/mod/
起動
$ sudo /etc/init.d/httpd restart
$ sudo /etc/init.d/httpd graceful
gracefulオプションは現在実行中のプロセスを待ってから再起動する
設定例
phpファイルをテキストで表示
AddHandler text/plain .php
強制的にphpとして実行
ForceType application/x-httpd-php
.htaccessを許可/禁止する
AllowOverride All # 許可
AllowOverride None # 禁止
ディレクトリアクセスしたときにindex.htmlを表示する
DirectoryIndex index.html
DocumentRootのディレクトリ以外を公開したい
Aliasを使う
Alias /hoge "/path/to/htdocs"
VirtualHostを使う
<VirtualHost 127.0.0.1>
<Directory /path/to/htdocs>
allow from all
</Directory>
</VirtualHost>
ディレクトリアクセスしたときに中身を表示しない
Options -Indexes
表示したい場合はハイフン”-“なしで
シンボリックリンクをたどるのを許可する
Options FollowSymLinks
hogeをリクエストしてhogeがなければhoge.*を表示するようにする
Options MultiViews
Basic認証をかける
AuthType Basic
AuthName "authenticate required"
AuthUserFile /path/to/.htpasswd
Require valid-user
他の設定ファイルを読み込む
Include /path/to/another/httpd.conf
phpファイルだけに適用させる
<Files ~ "\.php$">
...
</Files>
IP直打ちの場合は別のVirtualHostを表示したい
IP直打ちするとVirtualHostの一番最初の設定が表示される。 てきとーなやつを先頭に入れるだけでよい。
VirtualHostを設定したのにIP直打ちで来る人を残念賞にする方法 http://d.hatena.ne.jp/ir9Ex/20071014/1192366566
キャッシュクリア
<IfModule headers_module>
<Files ~ "\.css$">
Header set Pragma no-cache
Header set Cache-Control no-cache
</Files>
</IfModule>
画像等不要なファイルはアクセスログを取らないようにする
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)$" nolog
CustomLog "/path/to/log" combined env=!nolog
CustomLogで否定しないやり方も考えてみた。
URIのマッチングに否定戻り読み言明を使った。
SetEnvIf Request_URI "(?<!\.gif)(?<!\.jpg)(?<!\.png)(?<!\.css)(?<!\.js)(?<!\.ico)$" hoge
CustomLog "/path/to/log" combined env=hoge
こうすれば、特定のディレクトリのみ別のログにするというのも可能
(上記SetEnvIfをDirectoryディレクティブに追加すればいい)
[^\.(gif)|(jpg)]
でいけるかなと思ったけど、文字に分解されちゃうのでダメだった。
アクセスログを日別に記録する
CustomLog "|/usr/sbin/rotatelogs /path/to/log/access.%Y%m%d.log 86400 540" combined
アクセスログに情報を追加する (PHP)
http://neta.ywcafe.net/000607.html
httpd.confでLogFormatを編集
LogFormat "%h %l %u %t \"%r\" %>s %b %{originallog}n" common
PHPのapache_noteを実行する。
<?php
apache_note("originallog", $val);
例えばユーザーIDなどを埋め込むと便利。
Basic認証
Basic認証の仕組み
- クライアントがページをリクエストする(この時点ではまだ認証がかかってるかどうか知らない)
- クライアントに401レスポンスを返す
- ユーザにIDとパスワードの入力を求める
- 認証ヘッダを含めてページをリクエストする
- 成功すれば、通常のページを。そうでなければ再度401を返す
.htpasswd ファイルを作成する
# -c ファイル新規作成
# -s パスワードをSHA1
$ htpasswd -c -s .htpasswd username
httpd.conf / .htaccess での設定
AuthUserFile /path/to/.htpasswd
AuthName "basic auth"
AuthType Basic
Require valid-user
特定のファイルには認証をかけない
Satisfy ディレクティブを使う。 これは、RequireとAllowが両方使われている場合に、詳細な設定を行う場合に使用する。
# 画像のみ認証をかけない
<FilesMatch "\.(gif|jpe?g|png)$">
Satisfy Any
Allow from all
</FilesMatch>
特定のIPからのアクセスには認証をかけない
Satisfy Any
Allow from 127.0.0.1
メモ
- 同じパスのDirectoryディレクティブを2つ書くと、常に後に記述した方のみが適用され、前の方の設定は失われるっぽい。