🐕

Apache

2025/03/01に公開

設定ファイルはhttpd.conf

httpd.confとは、WebサーバのプログラムであるApacheの設定ファイル。
例えば、文字コードなどの設定をできる。

ディレクティブとコンテキストの違い

ディレクティブ

ディレクティブは、Apacheサーバーの設定を定義する命令や指示です。これらはApacheの動作を制御するために使用されます。
例えば以下をhttpd.confに記載することでApacheの挙動を設定できる。

ServerName: サーバーのホスト名を設定する。
DocumentRoot: サーバーのルートディレクトリを指定する。
ErrorLog: エラーログのファイルを指定する。

コンテキスト

コンテキストは、ディレクティブが有効となる範囲や場所を示すもので、どの設定がどの部分に適用されるかを決定します。
Apacheにはいくつかの異なるコンテキストがあり、ディレクティブは特定のコンテキスト内で有効になります。
おおむねコンテキストは4つあります。

サーバーレベル (Server Context)

サーバー全体に適用される設定。httpd.conf 内のディレクティブは通常、このコンテキストに適用されます。

仮想ホスト (VirtualHost Context)

特定の仮想ホスト(ドメインやIPアドレス別)の設定。<VirtualHost> 内に書かれたディレクティブは、その仮想ホストにだけ適用されます。

ディレクトリ (Directory Context)

特定のディレクトリに対して適用される設定。<Directory> タグ内に記述されたディレクティブは、そのディレクトリとそのサブディレクトリに対して有効です。

ファイル (Files Context)

特定のファイルに対して適用される設定。<Files> タグ内に記述されたディレクティブは、指定されたファイルに対してのみ有効です。
場所 (Location Context): 特定のURLパスに対して適用される設定。<Location> タグ内に記述されたディレクティブは、指定されたパスに対してのみ有効です。

# サーバーレベルでの設定
ServerRoot "/etc/httpd"
Listen 80

# 仮想ホストの設定
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/html/example"
</VirtualHost>

# 特定のディレクトリの設定
<Directory "/var/www/html/example">
    AllowOverride None
    Require all granted
</Directory>

エイリアスで遷移したいURLを指定する

構文

Alias エイリアス名 ファイル(ディレクトリ)へのパス

Alias /apache "c:/MAMP/htdocs/"

実行結果

指定したディレクトリとサブディレクトリに対してディレクティブを設定する

構文

<Directory ディレクトリのパス>

</Directory>

<Directory "c:/MAMP/htdocs/">
    ## ディレクトリにアクセスした際に最初に表示されるファイルを指定するための設定です。
    ## これは、ユーザーが特定のディレクトリにアクセスしたとき、ブラウザが自動的に表示するファイルを決定するために使用されます。
    DirectoryIndex dir1/test.txt
</Directory>

実行結果

.htaccess

.htaccessは.htaccessを配置したディレクトリ単位でディレクティブを指定できる。
.htaccessは非常に強力ですが、設定を誤るとウェブサイトの動作に影響を与えることもあるため、慎重に扱う必要があります。

.htaccessを使用するにはhttpd.confのAllowOverrideを設定する

設定値 説明
None .htaccess の設定を無視(デフォルト推奨)
All .htaccess で全ての設定を許可
AuthConfig 認証関連の設定を許可
FileInfo MIMEタイプやリライトルール (mod_rewrite) などを許可
Indexes ディレクトリリストの設定を許可
Limit アクセス制限(Allow、Deny、Require など)を許可
Options Options ディレクティブの使用を許可

.htaccessを使用するには、None以外を使用する。
実際にやってみる。

httpd.confのAllowOverrideをAllにする

C:\MAMP\htdoc内に、.htaccessを作成し以下を記載する

# 指定したファイルが見つからない場合、Error.txtを表示する
ErrorDocument 404 Error.txt

Error.txtを作成すると、以下のようなディレクトリになる。

"http://localhost:8888/test1.txt"にアクセスすると、test1.txtが存在しないのでError.txtが表示される

.htaccessはApache再起動する必要なし

リダイレクトを行う

リダイレクトは、あるURLにアクセスした際に、自動的に別のURLへ転送する仕組みのことです。

構文

Redirect [status] 元のURL リダイレクトするURL

[status]は、
301 永続的なリダイレクトの設定に使用
302 一時的に引っ越したことを表す(デフォルト)

実際にやってみる。
以下のような、test.txtとredirect-test/redirect.txtを用意する

Redirect /test.txt /redirect-test/redirect.txt

実行結果

外部のサイトもリダイレクト可能

Redirect /test.txt https://google.com

ページ単位のリダイレクト

Redirect /test.txt /redirect-test/redirect.txt

ディレクトリ単位のリダイレクト

Redirect /old-folder/ https://example.com/new-folder/

ドメイン全体のリダイレクト

Redirect 301 / https://newdomain.com/

301と302のキャッシュについて

301は、ブラウザがリダイレクトをキャッシュする。
302は、ブラウザがリダイレクトをキャッシュしない。
もしWebサーバ側でリダイレクトのURLを変えた場合、
302の場合は、変更したリダイレクトのURLが反映されるが、
301の場合は、Webブラウザのキャッシュを変更しない限り変更したリダイレクトのURLが反映されない。

ログの設定

エラーログのレベルを設定する

構文

LogLevel レベル

LogLevel error
レベル 説明
emerg 緊急
alert 致命的な状態
crit 認証関連の設定を許可
error エラー
warn 警告(デフォルト)
notice 普通だが、重要な情報
info 追加情報
debug デバッグメッセージ

エラーログのファイルパスを指定する

構文

ErrorLog ファイルパス

ErrorLog "C:/MAMP/logs/apache_error.log"

ログのフォーマットを指定する

構文

LogFormat "フォーマット文字列" ログフォーマット名

ログフォーマット名:CustomLogディレクティブで使用する名前(省略可能)
基本的に、CustomLogと一緒に使用する。

LogFormat "%h %l %u %t \"%r\" %>s %b" common

詳しい詳細は、以下を参照する。
https://chatgpt.com/share/67d0487e-aaa8-800e-96f9-d9d72021796e
https://chatgpt.com/share/67d0496e-14a4-800e-abb1-0cbb3b012b08

RewriteRuleとRewriteCondでURLのリダイレクトや書き換えを行う

RewriteRuleとRewriteCondで以下のようなことができる。
URLを別のファイルにリダイレクト
拡張子なしURLの対応
クエリパラメータをフレンドリーURLに変換
HTTPSへリダイレクト
wwwあり/なしの統一
IPアドレスによるアクセス制限
モバイルユーザーを専用ページにリダイレクト
https://chatgpt.com/share/67d2e755-84d4-800e-9c04-3ee48007205f

Discussion