おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

apacheを復習する(その2)

その1に引き続き、apacheのお勉強です。
apacheを復習する(その1) - おもしろWEBサービス開発日記

AccessFileName

AccessFileNameディレクティブで指定されたファイルは特権を持ちます。デフォルトでは.htaccessというファイル名が指定されています。ドキュメントディレクトリ内に、.htaccess(またはAccessFileNameで指定したファイル名)があった場合、そのファイルに書かれている内容でapacheの設定を上書きする事が出来ます。

AccessFileName .htaccess

AllowOverride

AllowOverrideディレクティブは、AccessFileNameディレクティブにて指定したファイル(通常は.htaccess)で、上書きする事が出来るディレクティブを設定します。デフォルトはAllです。.htaccessを使用するとパフォーマンスが落ちるので、webサーバとして公開するような際にはnoneを指定して.htaccessを読み込まないようにしておきます。

全てのディレクティブ指定を許可

AllowOverride All

全ての上書きを禁止

AllowOverride none

名前ベースのバーチャルホスト

バーチャルホストとは、1台のサーバで複数ドメインを運用する技術のことを指します。Apacheでバーチャルホストを実現する手段としては、名前ベースとIPベースがあります。最近は名前ベースのバーチャルホストを使用するのが普通だと思うので、こちらにフォーカスして調べます。
名前ベースのバーチャルホストとは、ブラウザが送るリクエストに含まれるドメイン名を見て、サーバ側で処理するコンテンツを分ける技術です。名前ベースのバーチャルホストを利用すると、一つのIPで複数ドメインを運営できて非常に便利です。でも一つ気をつけないといけない点があります。SSLを利用する場合です。SSLは、その仕様上リクエストを送る前に(つまりドメインを判別する前に)証明書の送付が行われます。なので、名前ベースのバーチャルホストを使っている場合、サーバ証明書複数使い分けることができません。

NameVirtualHost, VirtualHost, ServerName

NameVirtualHostは名前ベースのバーチャルホストを設定するためのディレクティブです。NameVirtualHostディレクティブを設定した場合、そこで設定したIPアドレス/ポート番号を設定しているVirtualHostディレクティブを調べ、リクエストで指定されたドメイン名と同じServerNameを持つブロックの設定を適用します。NameVirtualHostを設定しなかった場合は、リクエストで指定されたIPアドレスと合致するVitualHostブロックを検索します(つまりIPベースのバーチャルホストになります)。

NameVirtualHost *:80


  DocumentRoot /www/example1
  ServerName www.example.com
  # 他の設定



  DocumentRoot /www/example2
  ServerName www.example.org
  # 他の設定
 

IPアドレス、ホスト名でアクセス制限

Order, Allow, Denyディレクティブを使用する事で、IPアドレスやホスト名、または両者の組み合わせでのアクセス制限が実現できます。

後に書いた指定設定が優先になります。

Order allow, deny
Allow from all
Deny from 192.168.1.1

IPアドレスの他に、ホスト名やドメイン名の一部でもアクセス制限を設定できます。

User-Agentでアクセス制限

BrowserMatchディレクティブを使うと、User-Agentの内容でアクセス設定が出来ます。でもUser-Agentはクライアント側で詐称する事が可能なので、基本的には使わないのではないかと思います。

BrowserMatch "Mozilla" mozilla
Order deny, allow
Deny from all
Allow from env=mozilla

ヘッダ情報でアクセス制限

SetEnvIfディレクティブを使うと、リクエストヘッダーでアクセス制限ができます。

Refererでアクセス制限する例です。

SetEnvIf Referer "www\.example\.com" example
Order deny, allow
Deny from all
Allow from env=example

エラーメッセージの変更

ErrorDocumentディレクティブで、エラーが発生したときにクライアントに返すhtmlを指定できます。

ErrorDocument 404 /404.html

パスワードを使った認証

下記エントリでメモっているので基本的に省略します。Requireディレクティブだけ少し気になったので書きます。

apacheでの認証方法 - おもしろWEBサービス開発日記

Requireディレクティブ

パスワードファイルにはユーザ名とパスワードが複数書くことができます。Requireディレクティブでは、パスワードファイルに書かれているユーザ全員(valid-user)を許可するのか、そのうちの一部を許可するのか設定できます。一部を許可する場合は、グループで管理する方法とユーザで管理する方法の二通りがあります。

アクセス制限と認証を組み合わせるには

Satisfyディレクティブを使用すると、アクセス制限とパスワード認証の両方を使うか、またはどちらかがOKならアクセス可能にするか設定できます。デフォルトはallを指定したのと同じです。

アクセス制限と認証どちらかをパスすればアクセス可能にする設定。

Satisfy any

リダイレクト

apacheでリダイレクトの設定をしたい時はRecirectディレクティブを使います。

通常パターン(302)

Redirect /hoge/ http://www.example.com/fuga/

ステータスを指定したパターン。ステータスコード(301など)を指定する事も出来ます。

Redirect parmanent /hoge/ http://www.example.com/fuga/

正規表現を使ってリダイレクト

RedirectMatchディレクティブを使うと、正規表現も使ったリダイレクトができます。

Redirect parmanent ^/hoge/(.*)$ http://www.example.com/fuga/$1

コンテントネゴシエーション

リクエストヘッダーの

  • Accept-Language
  • Accept-Charset
  • Accept-Encoding

に指定してあるクライアントのコンテンツの対応状況を見て、サーバ側が最適なものを選択できる仕組みをコンテントネゴシエーションといいます。

コンテントネゴシエーションをするための設定

Multiviewsオプションを付加すると、コンテントネゴシエーションが有効になります。

Options +Multiviews

コンテントネゴシエーションが有効な時の設定

AddLanguageディレクティブを使用すると、言語設定を拡張子を関連づける事が出来ます。同じように、AddCharsetディレクティブを使用すると、文字コード拡張子と関連づける事が出来ます。

AddLanguage en .en
AddCharset shift_jis .sjis

ServerTokens

ServerTokensディレクティブを使用すると、レスポンスヘッダーのサーバ情報を隠すことができます。Apacheのバージョン情報等をクライアントに隠す事で、セキュリティを高める事が出来ます。apache2.2ではextra/httpd-languages.confに設定があります。

ServerTokens Prod

ServerSignature

ServerSignatureディレクティブを使用すると、エラードキュメントのサーバ情報を隠すことができます。ServerTokensディレクティブと同じように、情報を隠す事でセキュリティを高めます。

ServerSignature Off

参考

Apacheハンドブック
ApacheハンドブックBen Laurie

おすすめ平均
starsLINUX上のWEBサーバの基本
starsApache使い必須

Amazonで詳しく見る
by G-Tools
できるPRO Apache Webサーバー Apache2/1.3対応 (できるPROシリーズ)
できるPRO Apache Webサーバー Apache2/1.3対応 (できるPROシリーズ)辻 秀典

おすすめ平均
stars第2刷買いました
stars良い本とは思いますが初心者向きでは無いと思います。

Amazonで詳しく見る
by G-Tools