.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_YEAR | 年 | 2024 |
TIME_MON | 月 | 6 |
TIME_DAY | 日 | 28 |
TIME_HOUR | 時 | 5 |
TIME_MIN | 分 | 48 |
TIME_SEC | 秒 | 49 |
TIME_WDAY | 曜日 (0:日 ~ 6:土) | 3 |
TIME | 年月日時分秒 (例:20130123123456) | 20240628054849 |
API_VERSION | APIバージョン | |
THE_REQUEST | リクエスト文字列 | |
REQUEST_URI | リクエストURI | new/3/?time=123 |
REQUEST_FILENAME | リクエストされたファイル名 | /index.html |
IS_SUBREQ | サブリクエストか否か | |
HTTPS | HTTPSでのアクセスか否か | 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で指定するモジュールのソースファイルには以下のようなものがあります。
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を書き換える場合などに利用します。
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ディレクティブなどの詳しい解説は下記をご参考ください。
- 【WordPress】.htaccessとは何か?IfModule mod_write.c, Rewrite Engine, RewriteRuleの意味や書き方、フラグの一覧
- .htaccessのrewriteCondとは何か?%{REQUEST_FILENAME} !-f, -d, -f, !-d, -eq, [OR], [NC]の意味や使い方