decadence

個人のメモ帳

httpd.conf,htaccess

cgiを作る際に簡単なミスから偶然にも色々apacheについていじったのでメモ
一般知識としていずれ仕入れておかなければならないだろうし一応軽く…

設定をhttpd.confや.htaccessに記録する
違いは後述の有効範囲の話で
httpd.confではまた別に./extraのconfファイルを読み込む

取りあえずちょっと気になったけど場所分からないならば

find ディレクトリ -name httpd.conf

とかして探してみたり

設定知識

軽くhttpd.confなどを見たらすぐ探せるもの

ServerRoot "パス" 
  ルートディレクトリの指定
Listen (IPアドレス:)ポート番号
  リクエストを受け付けるポート番号の指定
LoadModule モジュール名 モジュールへのパス
  DSO(DynamicSharedObject)を用いたモジュールの組み込み
ServerAdmin 連絡先アドレスなど
  エラーが生じた際などの連絡先.他のサーバー上のアドレスを用いるべき
ServerName ホスト名(:ポート番号)
  IPアドレス,もしくはドメイン
Include パス
  extraなどに含まれる補助設定ファイルの読み込み

有効範囲

スコープのようなものと考えたら楽
と思ったけど,むしろスーパークラスとサブクラスのような.

httpd.confとhtaccess

apacheサーバーは最初にhttpd.confを読み込み設定を確認
そして全てのディレクトリでhtaccessがあるかを確認
存在すればそれまでの設定に対しhtaccessの設定を追加,重なっていれば上書き
親クラスの関数などを受け継ぎ,名前が重なればoverride,なければ追加.といった感じ
httpd.confは基本的に一つ,htaccessは全てのディレクトリに"あっても良い".

設定の有効範囲

またhttpd.confなどの中身に戻ります

<Directry dir-path> ~ </Directry>
  ディレクトリを指定
<DirectryMatch regex> ~ </DirectryMatch>
  正規表現でディレクトリを
<Files filename> ~ </Files>
  ファイルを指定
<FilesMatch regex> ~ </FilesMatch>
  正規表現でファイルを
<Location URL> ~ </Location>
  アドレスで指定

指定されたディレクトリやファイルに対して,中に書かれた事の対象とします

制限

ではでは,範囲指定などを行った上で何をするのか
良く行われる事の一つがアクセス制限など

アクセス制限

最も簡単なものにOrder, Allow, Denyの3つを用いたものがあります

Order deny,allow
  先にDenyを評価した上で,Allowを上書き.つまりAllow優先.
  逆に書く事も出来ます(Order allow,deny)
Deny from path
  pathへのアクセスを拒否します.pathへはallやIPとかも指定出来ます
Allow from path
  pathへのアクセスを許可します.pathへはallやIPとかも指定出来ます

ユーザー制限

また別にパスワードを用いて制限を行ったりも出来ます

AuthType Basic
AuthName "文章"
AuthUserFile "user-file-path"
Require entity-name [entity-name] ...

こんな感じですね
認証には2種類あり,Basicが基本認証,Digestはダイジェスト認証です
Requireでは許可するユーザ名を記述します
Basic認証でのuser-fileというのは以下のコマンドで新規作成できます

htpasswd -c user-file user-name

ユーザー追加時にはオプション抜いてそのまま打つだけ
削除は-Dです
Digest認証ではhtdigestというコマンドがあります

複数の制限

上記からホスト制限とユーザ制限を行う事が出来ます
両方のアクセスが必要,もしくは片方認証でアクセスが可能などといった設定はどうするのか

  • Satisfy All|any

Allをつければ全ての認証が必要です
Anyをつければ例えばあるIPからはパスワードなども必要無しに利用が出来るなど

cgi

エイリアスの作成

cgiなどのスクリプト直接置くのは形式上まずいのでエイリアスを作って他の場所におくとします
そのエイリアスもここに記載します

ScriptAlias URL-path file-path|directory-path
  普通に作成
ScriptAliasMatch regex file-path|directory-path
  正規表現マッチも行えます
特定の場所を指定する

ここでcgiを使いたい.などという場所を指定した後に

Options +ExecCGI
AddHandler cgi-script .pl .cgi

てな感じで指定出来ます


これでcgiの実行権限とかさえちゃんとしたら動かないなんていうことはなくなるはず.
知識と技術が足らなさ過ぎてつらい…


取りあえず,後は英語を読むかcore - Apache HTTP サーバを読むか