View on GitHub

akkunchoi.github.com

Apache 設定例

モジュールのマニュアル

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認証の仕組み

  1. クライアントがページをリクエストする(この時点ではまだ認証がかかってるかどうか知らない)
  2. クライアントに401レスポンスを返す
  3. ユーザにIDとパスワードの入力を求める
  4. 認証ヘッダを含めてページをリクエストする
  5. 成功すれば、通常のページを。そうでなければ再度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つ書くと、常に後に記述した方のみが適用され、前の方の設定は失われるっぽい。