Apache HTTP Serverの変数一覧

Apache HTTP Server (httpd) で使用可能な変数を整理した。
概要
Apache HTTP Serverには設定ファイル内で使用可能な変数が存在する。
これらの変数は,%{VARIABLE}のように,変数を%{}で囲むことで有効になる。きめ細かな処理を施す上に必要な情報が含まれており,設定ファイル内で多用する。
これらの変数についてよくわかっていなかったので整理する。
整理にあたっては,以下の情報源を参考にした。
変数一覧
Apache v2.4の公式サイトの変数一覧とその値の例を掲載する。mod_sslなど拡張モジュールの変数はきりがないのでひとまず除外する。
値の例は [https://localhost:8443/variable?q1=query1&q2=query2#id] のURLへのアクセスのものとなっている。
以下の変数はHTTP要請ヘッダーの該当する値が入っている。
| 変数 | 例 | 説明 |
|---|---|---|
| HTTP_ACCEPT | text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 | UAが受付可能なメディアタイプ。 |
| HTTP_COOKIE | jenkins-timestamper-offset=-32400000 | HTTP Cookieの項目と値。 |
| HTTP_FORWARDED | 経由したプロキシーの種類やバージョン情報。 | |
| HTTP_HOST | localhost:8443 | 元のURLのホスト。 |
| HTTP_PROXY_CONNECTION | プロキシーの接続情報。 | |
| HTTP_REFERER | 参照元URL。 | |
| HTTP_USER_AGENT | Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0 | User Agent (Webブラウザー) の種類。 |
上記の変数以外のHTTPヘッダーの値はreq関数で取得する。
その他のHTTP要請に関する変数は以下の通りとなっている。
| 変数 | 例 | 説明 |
|---|---|---|
| REQUEST_METHOD | GET | HTTPメソッド |
| REQUEST_SCHEME | https | URIのスキーム。 |
| REQUEST_URI | /variable | URIのパス部分。 |
| DOCUMENT_URI | /variable | REQUEST_URIと同じ。 |
| REQUEST_FILENAME | /home/senooken/.local/var/www/html/variable | 要請に一致するローカルファイルシステムのフルパス。 |
| SCRIPT_FILENAME | /home/senooken/.local/var/www/html/variable | REQUEST_FILENAMEと同じ。 |
| LAST_MODIFIED | 19700101090000 | ファイルの最終修正日時。 |
| SCRIPT_USER | senooken | スクリプトの所有者名。 |
| SCRIPT_GROUP | senooken | スクリプトのグループ名。 |
| PATH_INFO | ||
| QUERY_STRING | q1=query1&q2=query2 | 現在の要請のクエリー文字列。 |
| IS_SUBREQ | false | 現在の要請がサブ要請の場合に”true”, それ以外は “false” |
| THE_REQUEST | GET /variable?q1=query1&q2=query2 HTTP/1.1 | 完全な要請行。 |
| REMOTE_ADDR | 127.0.0.1 | リモートホストのIPアドレス。 |
| REMOTE_PORT | 34588 | リモートホストのポート番号 (v2.4.26以上で使用可能)。 |
| REMOTE_HOST | 127.0.0.1 | リモートホストのホスト名。 |
| REMOTE_USER | リモートホストの認証ユーザー名 (<If>内で使用不可能)。 | |
| REMOTE_IDENT | mod_identで設定されるユーザー名。 | |
| SERVER_NAME | localhost | 現在の仮想ホストのServerName。 |
| SERVER_PORT | 8443 | 現在の仮想ホストのポート番号。 |
| SERVER_ADMIN | you@example.com | 現在の仮想ホストのServerAdmin。 |
| SERVER_PROTOCOL | HTTP/1.1 | 要請に使用されたプロトコル。 |
| DOCUMENT_ROOT | /home/senooken/.local/var/www/html | 現在の仮想ホストのDocumentRoot。 |
| AUTH_TYPE | 設定されたAuthType (例: basic)。 | |
| CONTENT_TYPE | text/html; charset=iso-8859-1 | 応答のコンテントタイプ (<If>で使用不可能)。 |
| HANDLER | ハンドラーが作成する応答の名前。 | |
| HTTP2 | off | HTTP/2要請時に”on”, それ以外は”off”。 |
| HTTPS | on | HTTPS要請時に”on”,そうでなければ”off”。 |
| IPV6 | off | IPv6接続時に”on”, そうでなければ”off”。 |
| REQUEST_STATUS | 404 | 要請へのHTTPエラーステータス (<If>で使用不可能)。 |
| REQUEST_LOG_ID | 要請のエラーログID (参照: ErrorLogFormat)。 | |
| CONN_LOG_ID | 接続のエラーログID (参照: ErrorLogFormat)。 | |
| CONN_REMOTE_ADDR | 127.0.0.1 | 接続のピアーIPアドレス (参照: mod_remoteip) |
| CONTEXT_PREFIX | ||
| CONTEXT_DOCUMENT_ROOT | /home/senooken/.local/var/www/html |
HTTP要請とは無関係な変数は以下の通りとなる。
| 変数名 | 例 | 説明 |
|---|---|---|
| TIME_YEAR | 2020 | 現在の年。 |
| TIME_MON | 07 | 現在の月。 |
| TIME_DAY | 26 | 現在の日。 |
| TIME_HOUR | 09 | 現在の時間。 |
| TIME_MIN | 27 | 現在の分。 |
| TIME_SEC | 45 | 現在の秒。 |
| TIME_WDAY | 0 | 現在の曜日 (0が日曜日)。 |
| TIME | 20200726092745 | 現在の日時。 |
| SERVER_SOFTWARE | Apache/2.4.39 (Unix) OpenSSL/1.1.1a | サーバーバージョン文字列。 |
| API_VERSION | 20120211 | APIバージョンの日付。 |
頻出変数
全部で52個の変数が存在するが,よく使われる変数は限られてくる。そこで,よく使うと思われる変数を以下に抜粋した。
| 変数 | 例 | 説明 |
|---|---|---|
| HTTP_HOST | localhost:8443 | 要請先のURLのホスト名。 |
| SERVER_NAME | localhost | 現在の仮想ホストのServerName。 |
| REQUEST_URI | /variable | URIのパス部分。 |
| QUERY_STRING | q1=query1&q2=query2 | 現在の要請のクエリー文字列。 |
| HTTPS | on | HTTPS要請時に”on”,そうでなければ”off”。 |
| REQUEST_STATUS | 404 | 要請へのHTTPエラーステータス (<If>で使用不可能)。 |
| IS_SUBREQ | false | 現在の要請がサブ要請の場合に”true”, それ以外は “false” |
| LAST_MODIFIED | 19700101090000 | ファイルの最終修正日時。 |
| TIME | 20200726092745 | 現在の日時。 |
要請先URIの情報として,HTTP_HOST, SERVER_NAME, REQUEST_URI, QUERY_STRING, HTTPSがある。特に,REQUEST_URIはWebサイト上の特定のパスに対する処理に必要なため,よく使われる。
また,常時SSL/HTTPS化を施すために,現在の接続がHTTPSかどうかの判定に,HTTPSは便利だろう。REQUEST_SCHEMEでも判定できるが,より短くてわかりやすいHTTPSを使ったほうがよいだろう。
REQUEST_STATUSは<If>で使えないのは残念だが,ログなどで参考になるかもしれない。
IS_SUBREQは循環アクセスなどの判定に役立ちそうだ。
LAST_MODIFIEDとTIMEはともに日時に関する情報となっている。数値の演算により,アクセス先の情報の古さ・新しさを判定する際に役立ちそうだ。
その他,URIの#以降のフラグメント部分はWebサーバーに送信されておらず変数で参照できないことに注意する。
これはURIの構文で以下のように定められている。
As such, the fragment identifier is not used in the scheme-specific processing of a URI; instead, the fragment identifier is separated from the rest of the URI prior to a dereference, and thus the identifying information within the fragment itself is dereferenced solely by the user agent, regardless of the URI scheme.
フラグメント部はUA (Webブラウザー) でだけ参照されることになっている。
結論
Apache HTTP Serverの変数を整理した。
52個も変数があるが,よく使い物は10個程度だ。httpd.confなどで変数がでてきたら,こちらのページを見返して,思い出したい。

“Apache HTTP Serverの変数一覧” に対して1件のコメントがあります。