.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 の基礎知識様から引用させていただきました。