.htaccessで使える正規表現・環境変数・mod_rewriteについて

.htaccessの中で使える正規表現や環境変数、mod_rewriteについて、備忘録も兼ねてまとめました。

mod_rewriteとモジュールの意味

mod_rewriteとは、Apacheというサーバで利用されているURLの書き換え・リダイレクト処理を行うモジュールです。
「.htaccess」で記述して使用できます。

mod_rewriteモジュールには、

  • RewriteEngine
  • RewriteCond
  • RewriteRule
  • RewriteBase

などがあります。

リダイレクトを開始するRewriteEngine

RewriteEngine on でこれからURLのリダイレクトを行うことを示します。

リダイレクト条件を指定するRewriteCond

URLリダイレクトを行う条件を指定します。

RewriteCond %{HTTPS} off

(HTTPS通信ではない場合)

URLパターンと転送先を指定するRewriteRule

合致するURLと転送先を指定します。

RewriteRule ^(.*)$ https://(新URL)/$1 [R=301,L]

どんなURLでも、https://(新URL)に301リダイレクトします。

ベースとなるディレクトリを指定するRewriteBase

RewriteBase /

リライト処理のベースとなるURLを指定します。
これがない場合は.htaccessがあるディレクトリになります。
「RewriteBase /」と記述しておくとルートからのパスになります、わかりやすくなるのでおすすめです。

mod_rewriteモジュールの宣言方法

mod_rewriteモジュールを使用する場合は
使用するコードを以下のように<IfModule mod_rewrite.c>〜</IfModule>で囲みます。

<IfModule mod_rewrite.c>
・・・
ここにリライトモジュールを記載する
・・・
</IfModule>

mod_rewriteでは正規表現が使える

mod_rewrite内では正規表現が使うことができます。
よく使うものは以下の通りです。

! 否定
\ エスケープ文字(正規表現として認識しない)
.* 全て

フラグ

RewriteRuleの最後にフラグ[]を追記することができます。

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
R=301 RはリダイレクトのR
「R=301」とすると、301リダイレクトを指定する。
L LastのL
L が指定されている RewriteRule の条件にマッチした場合、以降のRewriteRuleを処理しない。
ただし.htaccessではLフラグが有効にならないので、つけても意味はない。
NC 大文字小文字を区別しない(指定しなかった場合は区別する)

OR条件

RewriteCond %変数名 条件① [OR,NC]
RewriteCond %変数名 条件②
RewriteRule URL書換&転送の記述

条件①と条件②いずれかを満たす場合、リダイレクトを行う。

AND条件

RewriteCond %変数名 条件①
RewriteCond %変数名 条件②
RewriteRule URL書換&転送の記述
[OR]フラグを記載せず、2行続けてRewriteCondを記載する場合、条件①と条件②の両方を満たす場合リダイレクトを行う。

RewriteCondでのパーセント記号(%)は環境変数

RewriteCondでのパーセント記号(%)は、環境変数を表します。
{}の中に接続してきたブラウザなどの情報から、環境変数名を読み込んで使用することができます。

RewriteCond %{HTTP:X-Forwarded-Proto} !https

%{HTTP:X-Forwarded-Proto} = HTTPヘッダを取得する

その他の環境変数は以下の通りです。

グループ 変数名 値・意味
HTTP ヘッダ HTTP_USER_AGENT ユーザーエージェント
HTTP_REFERER 参照元URL
HTTP_COOKIE クッキー情報
HTTP_FORWARDED プロキシ情報
HTTP_HOST サーバーのホスト名
HTTP_PROXY_CONNECTION プロキシを経由しているか否か
HTTP_ACCEPT ブラウザの言語タイプ
コネクション & リクエスト REMOTE_ADDR リモートアドレス
REMOTE_HOST リモートホスト名
REMOTE_USER リモートユーザー名 (基本認証利用時)
REMOTE_IDENT リモートユーザーのID
REQUEST_METHOD リクエストメソッド
SCRIPT_FILENAME スクリプトファイル名
PATH_INFO パス情報
QUERY_STRING クエリ文字列
AUTH_TYPE 認証タイプ
サーバ内部変数 DOCUMENT_ROOT ドキュメントルートのパス
SERVER_ADMIN サーバー管理者情報
SERVER_NAME サーバー名
SERVER_ADDR サーバーのアドレス
SERVER_PORT サーバーのポート番号
SERVER_PROTOCOL プロトコルバージョン
SERVER_SOFTWARE サーバーソフトウェア
システム関連 TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY 曜日 (0:日 ~ 6:土)
TIME 年月日時分秒 (例:20130123123456)
特別なもの API_VERSION APIバージョン
THE_REQUEST リクエスト文字列
REQUEST_URI リクエストURI
REQUEST_FILENAME リクエストされたファイル名
IS_SUBREQ サブリクエストか否か
HTTPS HTTPSでのアクセスか否か

表はApache RewriteCond の基礎知識から引用させていただきました。

おすすめの記事