mod_rewriteモジュールのディレクティブと正規表現 【ブラウザがHTTP環境変数でヘッダー情報としてHTTP_REFERERを送ることでGoogle Analyticsが参照元を認識できる】

正規化と正規表現

今はなき第一種情報処理試験のシステム工学で、データベースの正規化の問題がありましたが、この場合の正規化とはテーブル間の冗長性をキーに基づいて省いていくプロセスのことです。

同じように、正規表現も文字列全体の冗長性を、メタ文字(特殊文字)に基づいて省いていく表現方法です。

Apacheのmod_rewriteモジュールに対してURL表記をリライトしてね、という指令を.htaccessファイルに記述して、httpd.conf設定を上書するために正規表現を使います。

.htaccessファイルに記述するディレクティブと正規表現

ディレクティブ(Directive)とはコマンドと同じ意味ですが、Apacheのmod_rewriteモジュールが実装するコマンドの場合はディレクティブと呼んでいます。

#SITEGUARD_PLUGIN_SETTINGS_START
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_START
<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteBase /
 RewriteRule ^wp-signup\.php 404-siteguard [L]
 RewriteRule ^wp-activate\.php 404-siteguard [L]
 RewriteRule ^login_12345(.*)$ wp-login.php$1 [L]
</IfModule>
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#SITEGUARD_PLUGIN_SETTINGS_END

WordPressのプラグインSiteGuardを有効化するたびに自動的に更新される部分です。

  • 3行目:mod_rewriteが利用できるかどうかを確認
  • 4行目:RewriteEngineをオン
  • 5行目:Rewrite処理のベースになるURLを指定。
  • 6行目:「wp-signup.php」という文字列を「404-siteguard」という文字列を置き換え
  • 7行目:「wp-activate.php」という文字列を「404-siteguard」という文字列を置き換え
  • 8行目:「login_12345」とそれに続く任意の文字列を「wp-login.php」という文字列の後ろに任意の文字列をくっつけて置き換え

実際には8行目の正規表現(.*)はブランクなので後方参照である$1もブランクになり、「login_12345という文字列をwp-login.phpという文字列に置き換え」という意味になります。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://bahtera.jp/$1 [R=301,L]
</IfModule>
  • 4行目:HTTPSによるアクセスでない場合
  • 5行目:任意の文字列をHTTPS通信のURLに続く後方参照として置き換え

ちなみに[R=301,L]はRewriteRuleのオプションでリダイレクト(R)の301として指定し、RewriteRuleの条件にマッチした場合にはこれが最後(ラストの[L])で以降は処理しない、という意味です。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

これはWordPressをインストールすると自動的に記述するみたいですね。

  • 5行目:HTTP環境変数に入っているモノがファイルでない(ファイルが存在しない)
  • 6行目:HTTP環境変数に入っているモノがディレクトリでない(ディレクトリが存在しない)

HTTP環境変数とはブラウザがサーバにアクセスする際に、HTTPヘッダに各種の情報を含めて送信するもので、Google Analyticsが参照元を認識できるのは、ブラウザがヘッダー情報としてHTTP_REFERERを送ってくるからです。

REQUEST_FILENAMEはリクエストされたファイルの名前、要は入力された文字列であり、これ以外によく登場するHTTP環境変数が以下のようなものです。

  • HTTP_HOST:閲覧しているサイトのドメイン
  • HTTPS:SSL通信の有無
  • HTTP_REFERER:前にいたページのURL