Apache HTTP Serverの変数の確認方法

概要
「Apache HTTP Serverの変数一覧」で変数一覧を整理した。ただ,実際に変数を使う場合,現在の変数の値が想定していたものと異なり,思うように処理ができないことがある。こういう場合に,デバッグのために変数の値を確認したい。
意外と現在のApacheの変数の確認方法が記されているWebサイトがなかったので,Apacheの現在の変数の確認方法を整理した。
以下の情報源を参考にした。
方法
Apacheでの変数の確認方法は大きく以下の3種類が存在する。
RewriteRule
指令のリダイレクトしてクエリー文字列に指定Header
指令でHTTP応答ヘッダーに表示ErrorDocument指令
でエラー画面に表示
1番目のRewriteRule
指令を使う場合,クエリー文字列に変数を列挙する。リダイレクト先にphpなどのプログラムを指定することで,クエリー文字列の内容をプログラム上で出力することができる。ただし,大量の変数を指定するとクエリー文字列が1行で長くなり,扱いにくくなる。
2番目のHeader
指令でHTTP応答ヘッダーに変数を含めることができる。RewriteRule
指令と異なり,リダイレクト先を考えなくていいので,より手軽だ。ただし,こちらもRewriteRule
指令と同じく,1行に大量に列挙することになるので若干手間がかかる。
3番目のErrorDocument
指令を使う方法が一番推奨する方法だ。この方法では,任意の未存在のページアクセス時に発生するHTTP 404応答ステータスのエラー画面表示を自分でカスタマイズする。これにより,HTMLで変数の一覧を表示できる。他の方法と異なり,HTMLで表示方法を自由に指定できるため,視認性や融通が最も効く。
また,ErrorDocument
指令はcore
モジュールの指令であり,追加モジュールを必要とせず,どのApacheでも使用可能であり,汎用性が高い。
設定例
これらの3の方法の設定例を以下に記す。GitHubでも公開している。
.htaccess
の例################################################################################
## \file .htaccess
## \author SENOO, Ken
## \copyright CC0
## \date Created: 2020-07-27T05:02+09:00
## \sa https://senooken.jp/post/2020/09/11/
## \brief Apacheの変数の確認方法
##
## 事前に `httpd.conf` で `AllowOverride FileInfo` を指定しておく。
################################################################################
## RewriteRuleのリダイレクトでクエリー文字列に指定
<IfModule rewrite_module>
RewriteEngine on
RewriteRule ^rewrite /rewritten?https=%{HTTPS}&ua=%{HTTP_USER_AGENT} [L,R]
</IfModule>
## Redirectだとクエリーの変数が展開されない
Redirect "/redirect" /redirected?https=%{HTTPS}&ua=%{HTTP_USER_AGENT}
## HeaderでHTTP応答ヘッダーに出力
<IfModule headers_module>
Header append Variable "HTTPS=%{HTTPS}e"
</IfModule>
## Errorでのerror_logでの出力時は変数を展開しない
# Error "HTTPS=%{HTTP_HOST}"
## ErrorDocumentでエラー画面に表示
<If "%{REQUEST_URI} == '/variable'">
ErrorDocument 404 "<!DOCTYPE html> \
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'> \
<head> \
<meta charset='UTF-8' /> \
<meta name='author' content='SENOO, Ken' /> \
</head> \
<body><main><section> \
<h1>Apache HTTP Server standard variables</h1> \
<p>This page show Apache HTTP Server (httpd) standard variables (ex. <a href='https://httpd.apache.org/docs/2.4/expr.html#vars'>Expressions in Apache HTTP Server - Apache HTTP Server Version 2.4</a>)</p> \
<p>Variables is listed on v2.4 (2020-07-26 Sun).</p> \
<table> \
<caption>HTTP header related variables</caption> \
<thead> \
<tr><th> Variable </th><th> Value </th></tr> \
</thead><tbody> \
<tr><td> HTTP_ACCEPT </td><td> %{HTTP_ACCEPT} </td></tr> \
<tr><td> HTTP_COOKIE </td><td> %{HTTP_COOKIE} </td></tr> \
<tr><td> HTTP_FORWARDED </td><td> %{HTTP_FORWARDED} </td></tr> \
<tr><td> HTTP_HOST </td><td> %{HTTP_HOST} </td></tr> \
<tr><td> HTTP_PROXY_CONNECTION </td><td> %{HTTP_PROXY_CONNECTION} </td></tr> \
<tr><td> HTTP_REFERER </td><td> %{HTTP_REFERER} </td></tr> \
<tr><td> HTTP_USER_AGENT </td><td> %{HTTP_USER_AGENT} </td></tr> \
</tbody></table> \
<table> \
<caption>Misc variables</caption> \
<thead> \
<tr><th> Variable </th><th> Value </th></tr> \
</thead><tbody> \
<tr><td> TIME_YEAR </td><td> %{TIME_YEAR} </td></tr> \
<tr><td> TIME_MON </td><td> %{TIME_MON} </td></tr> \
<tr><td> TIME_DAY </td><td> %{TIME_DAY} </td></tr> \
<tr><td> TIME_HOUR </td><td> %{TIME_HOUR} </td></tr> \
<tr><td> TIME_MIN </td><td> %{TIME_MIN} </td></tr> \
<tr><td> TIME_SEC </td><td> %{TIME_SEC} </td></tr> \
<tr><td> TIME_WDAY </td><td> %{TIME_WDAY} </td></tr> \
<tr><td> TIME </td><td> %{TIME} </td></tr> \
<tr><td> SERVER_SOFTWARE </td><td> %{SERVER_SOFTWARE} </td></tr> \
<tr><td> API_VERSION </td><td> %{API_VERSION} </td></tr> \
</tbody></table> \
<table> \
<caption>Other request related variables</caption> \
<thead> \
<tr><th> Variable </th><th> Value </th></tr> \
</thead><tbody> \
<tr><td> REQUEST_METHOD </td><td> %{REQUEST_METHOD} </td></tr> \
<tr><td> REQUEST_SCHEME </td><td> %{REQUEST_SCHEME} </td></tr> \
<tr><td> REQUEST_URI </td><td> %{REQUEST_URI} </td></tr> \
<tr><td> DOCUMENT_URI </td><td> %{DOCUMENT_URI} </td></tr> \
<tr><td> REQUEST_FILENAME </td><td> %{REQUEST_FILENAME} </td></tr> \
<tr><td> SCRIPT_FILENAME </td><td> %{SCRIPT_FILENAME} </td></tr> \
<tr><td> LAST_MODIFIED </td><td> %{LAST_MODIFIED} </td></tr> \
<tr><td> SCRIPT_USER </td><td> %{SCRIPT_USER} </td></tr> \
<tr><td> SCRIPT_GROUP </td><td> %{SCRIPT_GROUP} </td></tr> \
<tr><td> PATH_INFO </td><td> %{PATH_INFO} </td></tr> \
<tr><td> QUERY_STRING </td><td> %{QUERY_STRING} </td></tr> \
<tr><td> IS_SUBREQ </td><td> %{IS_SUBREQ} </td></tr> \
<tr><td> THE_REQUEST </td><td> %{THE_REQUEST} </td></tr> \
<tr><td> REMOTE_ADDR </td><td> %{REMOTE_ADDR} </td></tr> \
<tr><td> REMOTE_PORT </td><td> %{REMOTE_PORT} </td></tr> \
<tr><td> REMOTE_HOST </td><td> %{REMOTE_HOST} </td></tr> \
<tr><td> REMOTE_USER </td><td> %{REMOTE_USER} </td></tr> \
<tr><td> REMOTE_IDENT </td><td> %{REMOTE_IDENT} </td></tr> \
<tr><td> SERVER_NAME </td><td> %{SERVER_NAME} </td></tr> \
<tr><td> SERVER_PORT </td><td> %{SERVER_PORT} </td></tr> \
<tr><td> SERVER_ADMIN </td><td> %{SERVER_ADMIN} </td></tr> \
<tr><td> SERVER_PROTOCOL </td><td> %{SERVER_PROTOCOL} </td></tr> \
<tr><td> DOCUMENT_ROOT </td><td> %{DOCUMENT_ROOT} </td></tr> \
<tr><td> AUTH_TYPE </td><td> %{AUTH_TYPE} </td></tr> \
<tr><td> CONTENT_TYPE </td><td> %{CONTENT_TYPE} </td></tr> \
<tr><td> HANDLER </td><td> %{HANDLER} </td></tr> \
<tr><td> HTTP2 </td><td> %{HTTP2} </td></tr> \
<tr><td> HTTPS </td><td> %{HTTPS} </td></tr> \
<tr><td> IPV6 </td><td> %{IPV6} </td></tr> \
<tr><td> REQUEST_STATUS </td><td> %{REQUEST_STATUS} </td></tr> \
<tr><td> REQUEST_LOG_ID </td><td> %{REQUEST_LOG_ID} </td></tr> \
<tr><td> CONN_LOG_ID </td><td> %{CONN_LOG_ID} </td></tr> \
<tr><td> CONN_REMOTE_ADDR </td><td> %{CONN_REMOTE_ADDR} </td></tr> \
<tr><td> CONTEXT_PREFIX </td><td> %{CONTEXT_PREFIX} </td></tr> \
<tr><td> CONTEXT_DOCUMENT_ROOT </td><td> %{CONTEXT_DOCUMENT_ROOT} </td></tr> \
</tbody></table> \
</section><main></body></html>"
</If>
GitHubではErrorDocument
指令を使った全標準変数の表示例も記している。こちらの.htaccessを自分の環境で使うことで,手軽に変数を確認できるだろう。
Header指令で変数を表示させる場合は,%{HTTPS}e
のように末尾にe
が必要なことに注意する。
失敗例
Apacheでの変数の表示例の調査中にいくつか失敗例を見つけたので紹介する。
RewriteRule
指令とよく似ているRedirect
指令も試したのだが,こちらは変数が展開されなかった。
その他,ErrorDocument
指令と似たError
指令も試したのだが,こちらも同じく変数が展開されなかった。
結論
Apacheの変数の確認方法を整理した。
Apacheの設定をいろいろ編集していると,変数が期待と異なっていて動作しないことがあった。変数の確認方法がわからず,四苦八苦していた。
今回,Apacheの変数の確認方法を整理したので,次回からは今回用意した.htaccess
で変数の内容を確認して,効率的にデバッグしたい。