【APACHE】.htaccessに記述した変数・環境変数の中身を確認・デバッグする方法(HTTP_HOST、REQUEST_URI、REQUEST_FILENAME)

wordpress-prograshi(プロぐらし)-kv WordPress
記事内に広告が含まれていることがあります。
[PR]

.htaccessにRewriteRuleなどを記述して転送設定などを行っているときに、変数の中身を確認したいといった場合があります。例えば、HTTP_HOST、REQUEST_URI、REQUEST_FILENAMEなどです。

JavaScriptではconsole.logなどで簡単に確認できるのですが、.htaccessの場合はいったいどうやるのだろう?と疑問に持たれている方も多いと思います。

ここでは、.htaccessで使用している変数の確認方法についてまとめています。


変数とはどんなもの?一覧と実例

はず初めにですが、.htaccessで使われる変数には、よく使うHTTP_HOST、REQUEST_URI、REQUEST_FILENAMEをメインとして、他にも以下のようなものがあります。

環境変数内容値の例
HTTP_USER_AGENTユーザーエージェントMozilla/1.5
HTTP_REFERER参照元URL
HTTP_COOKIEクッキー情報
HTTP_FORWARDED要求が転送された場合に、通過したプロキシー・サーバーのアドレスとポート
HTTP_HOSTサーバーのホスト名〇〇.com
HTTP_PROXY_CONNECTIONプロキシサーバとの接続状態
HTTP_ACCEPTブラウザーがサポートしているコンテンツ・タイプtext/xml
DOCUMENT_ROOTドキュメントルートのパス
SERVER_ADMINサーバー管理者情報
SERVER_NAMEサーバー名
SERVER_ADDRサーバーのアドレス
SERVER_PORTサーバーのポート番号
SERVER_PROTOCOLプロトコルバージョン
プロトコルバージョンサーバーソフトウェア
REMOTE_ADDRリモートアドレス
REMOTE_HOSTリモートホスト名
REMOTE_USERリモートユーザー名 (基本認証利用時)
REMOTE_IDENTリモートユーザーのID
REQUEST_METHODリクエストメソッド
SCRIPT_FILENAMEスクリプトファイル名
PATH_INFOパス情報
QUERY_STRINGクエリ文字列time=123
AUTH_TYPE認証タイプ
TIME_YEAR2024
TIME_MON6
TIME_DAY28
TIME_HOUR5
TIME_MIN48
TIME_SEC49
TIME_WDAY曜日 (0:日 ~ 6:土)3
TIME年月日時分秒 (例:20130123123456)20240628054849
API_VERSIONAPIバージョン
THE_REQUESTリクエスト文字列
REQUEST_URIリクエストURInew/3/?time=123
REQUEST_FILENAMEリクエストされたファイル名/index.html
IS_SUBREQサブリクエストか否か
HTTPSHTTPSでのアクセスか否かon / off


なお、変数は、%{ 変数名 } のように記述します。例えば以下のように使います。

(例1)
RewriteCond %{HTTP_USER_AGENT} "=This Robot/1.0"

(例2)
RewriteCond /var/www/%{REQUEST_URI} !-f
RewriteRule ^(.+) /other/archive/$1 [R]

(例3)
RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
RewriteRule "^/images" "-" [F]

(例4)
RewriteCond  "%{HTTP_USER_AGENT}"  "(iPhone|Blackberry|Android)"
RewriteRule  "^/$"                 "/homepage.mobile.html"  [L]



デバッグ方法|変数の中身を確認する方法

続いて本題です。.htaccessで使っている変数の中身を確認するには以下のコードを使用します。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{変数} [R,L]
</IfModule>

すごく簡単です。

これだけで、WEBサイト上のURLをたたくと、指定した変数が付いたURLが表示されます。


検索窓にURLを入力します。


すると、リダイレクトがかかり、ドメインの後ろに指定した「?」と変数の値が表示されます。




実際に.htaccessに追記する方法

実際に.htaccessに追記するときは、既存の記述があるのでそれは消さずに、上の方に追記すれば問題ありません。以下の例を参考にしていただければと思います。

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On

#この1行だけ追記
RewriteRule ^(.*)$ /?%{変数} [R,L]

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /test/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test/index.php [L]
</IfModule>

# END WordPress


すでに、RewriteEngine Onディレクティブが記述してある場合は、その下にURLとして変数を表示するためのRewriteRuleを記述すればOKです。

[L]フラグをつけていることで、この処理のみが実行されることになります。




複数の変数をまとめて表示したい

上記の例は1つの変数のみを表示しますが、複数まとめて表示することもできます。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{変数1}___%{変数2}___%{変数3} [R,L]
</IfModule>

上記の場合は、アンダースコア3つで変数を後ろにつなげています。

別にアンダースコア3つでなく、1つだけやハイフンなどを使っても問題ありません。URLに表示されたときに見やすい表記になっていることが重要です。

もちろん変数は2個や4個など、任意の数をつなげられます。



実例

例えば、「REQUEST_URI」「REQUEST_FILENAME」「HTTP_HOST」の値を確認したい場合は以下のようにします。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{REQUEST_URI}___%{REQUEST_FILENAME}___%{HTTP_HOST} [R,L]
</IfModule>


URLをたたくと、以下のように「___」でつながって変数の値が表示されます。


「https://〇〇.com/test」というURLをたたいたので、「REQUEST_URI」には「test」が表示されています。

「REQUEST_FILENAME」は「/home/users/0/~/web/~/test/」となっています。「HTTP_HOST」は「〇〇.com」です。


文字列もまとめて表示する

URLに表示したときに、だいたいどれがどの変数の値か見ればわかりますが、よりわかりやすくするために、変数の前に変数名を文字列として指定することもできます。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?文字列1=%{変数1}___文字列2=%{変数2}___文字列3=%{変数3} [R,L]
</IfModule>

注意点としては、URLがすごく長くなるので見やすいかどうかは人によるということです。


<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?REQUEST_URI=%{REQUEST_URI}___REQUEST_FILENAME=%{REQUEST_FILENAME}___HTTP_HOST=%{HTTP_HOST} [R,L]
</IfModule>


ブラウザでの表示は以下のようになります。指定した変数の値の前に、指定した文字列が表示されています。



正規表現と一致したパターンを表示する

RewriteRuleディレクティブは、1つ目の引数で正規表現を使ってパターンマッチを行っています。

このパターンマッチしたものを第2引数で置き換えるというのがRewriteRuleの仕様です。例えば以下の部分だと、^(.*)$にマッチした部分が置換対象となります。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{変数} [R,L]
</IfModule>


この正規表現にマッチした中身を見たい場合は以下のように $1 を記述します。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{変数}---$1 [R,L]
</IfModule>


ハイフン3つでつないでいますが、ここはなんでもいいです。URLに表示されたときにどこからがどの変数の値かがわかることが重要です。

正規表現のパターンにマッチしたものは変数「$1」に入ります

なお、正規表現で複数のカッコ( )を使っている場合は、該当したパターンが前方から順に「$1」「$2」「$3」1・・・という変数に入ります。


実例

例えば、.htaccessを以下のように記述したとします。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{REQUEST_URI}---$1 [R,L]
</IfModule>


このときにブラウザで「https://〇〇.com/test/aaa/bbb/ccc」というURLをたたいたとします。すると結果は以下のように表示されます。

「—」の後ろでどのパターンとマッチしたのかがわかります。



コードの解説

今回使用したコードが具体的に何をしているのかについて、簡単に解説します。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ /?%{変数} [R,L]
</IfModule>


IfModuleとは何か?

最初に出てくるのが IfModule です。IfModuleの後ろで、実行したいモジュールのソースファイルを指定します。

これは、if文で、もし指定したモジュールがあるなら処理を実行する。ないなら実行しないという意味になります。

<IfModule モージュールのソースファイル>
処理
</IfModule>


.htaccessで指定するモジュールのソースファイルには以下のようなものがあります。

主なモジュールのソースファイル
  • mod_rewrite.c
  • mod_expires.c
  • mod_reqtimeout.c

など

(参考)APACHE公式 モジュール一覧



IfModuleを記述しないとどうなる?

ちなみに、IfModuleを記述せずとも、対象のモジュールが存在する場合は問題なく処理を実行できます。

ですが、対象のモジュールがない場合はエラーが発生します



mod_rewrite.c

WordPressをインストールしたときに .htaccessのIfModuleで必ず指定されるのが「mod_rewrite.c」です。

<IfModule mod_rewrite.c>
処理
</IfModule>

これは、mod_rewriteというモジュールのソースファイルを示しています。

つまり、「mod_rewirteモジュールを使いたいので、このモジュールファイルがあるか探してください。ある場合は以下の処理を実行してください。ない場合は無視してください」という意味になります。

mod_rewriteの冒頭の「mod」は「モジュール(module)」と言う意味です。rewriteはURLやパスの書き換えです。つまり、リダイレクトの設定を行うモジュールになります。

アクセスしてきたURLに対して、そのURLを書き換える場合などに利用します。


(参考)APACHE公式 mod_rewrite


RewriteEngineとは何か?

処理の冒頭にくる、RewriteEngineは、mod_rewirteのモジュールに用意されているディレクティブ(指示)の一つです。

RewriteEngine をOnにすると、mod_rewirteの機能を有効化します。無効にしたい場合は Offと記述します。

RewriteEngine On


RewriteRuleとは何か?

RewriteEngineでmod_rewriteを有効化した後にくるのが、RewriteRuleです。


RewriteRuleの基本構文

RewriteRuleもディレクティブ(指示)の1つで、①アクセスしてきたURLに対して、②置換後の(表示する)URLを指定しますその後ろで、③フラグを指定します。

なお、アクセスしてきたURLは基本的に正規表現で記述します。表示するURLでは入力URLの正規表現にマッチする値を変数として使うこともできます。

RewriteRule ①入力URL ②置換後のURL [フラグ]



今回のコード

今回の場合は以下のようになります。

RewriteRule ^(.*)$ /?%{変数} [R,L]

^(.*)$ これは正規表現で全てのURLが対象という意味になります。

^(キャレット)は先頭一致、(.*)で任意の1文字の0回以上の繰り返し、$は後方一致です。


置換後のURLで/?%{変数}を指定しています。

「?」はクエリ文字列です。パラメータと呼ばれるのが一般的です。

これがないと、指定した変数の値をURLのディレクトリとして拾ってしまいます。URLとしては表示されますがページは404になります。


フラグ

最後に[R,L]という表記があります。これはフラグで、[R]と[L]の2つを指定しています。

[R]は302転送(一時的)することを指示しています。[L]は処理を終了し、以降の書き換えは行わないという指示です。

このため、指定したURLに302転送し処理を終了します。



参考

mod_rewriteモジュールやRewriteRuleディレクティブなどの詳しい解説は下記をご参考ください。


タイトルとURLをコピーしました