WordPressを使っていると「.htaccess」という単語に出会います。時にはこの「.htaccess」を追記、編集といった作業が必要になることもあります。
ここでは、そもそも.htaccessとは何か?や、WordPressを構築したときにデフォルトで記述してあるIfModule mod_write.c, Rewrite Engine, RewriteCond, RewriteRuleなどの意味や書き方についてまとめています。
.htaccessとは何か?
.htaccessの読み方
.htaccessは、ドットエイチティーアクセスと読みます。一般的には単に「エイチティーアクセス」と呼ぶことが多いです。
なお、ファイル名の冒頭に「.(ドット)」がつくファイルは隠しファイルです。サーバーなどの重要な機能に影響を与えるものを一般のファイルと分けるために、あえて隠しファイルとなっています。
例えば、Githubでサーバーのレポジトリへのアップロードを避けたい場合には.gitignore(ギットイグノア)という隠しファイルを使います。
.htaccessの役割
WEBサイトはサーバー上にあるフォルダやファイルによって表示されています。例えば、「https://prograshi.com/」などのURLをクリックしたときは、対象のファイルやフォルダがあるディレクトリにアクセスしその情報を取得しています。
このURLにアクセスしたときに、このディレクトリ(パス)にアクセスするといった制御はサーバー本体でも行うことができます。
ですが最近では、1つのサーバーの中に複数のWEBサイトが構築してあるのが一般的です。サーバー本体の設定を変更するとサーバーの中にあるすべてのサイトに影響が及びます。設定をミスってすべてのWEBサイトが表示されなくなった、、、となったら大変なことです。
そこで、サーバーの設定をディレクトリ単位、つまり、対象となるWEBサイトのみに対して行えるのが「.htaccess」です。
.htaccessでできること
.htaccessを使うといろんなことができるのですが、主なものを上げると以下になります。
.htaccessはどこにある?
.htaccessファイルはWEBサイトを構築してディレクトリのルートディレクトリ(最上位階層)にあります。
デフォルトの中身は以下のようになっています。
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
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
以下では、このデフォルトで記述されている.htaccessの中身について解説します。
#~とは何か?(冒頭のシャープ)
.htaccessの中には冒頭に#がついた記述が記載れています。この冒頭の「#」はコメントアウトです。
例えば以下の記述は、WordPressが自動生成したものですよということを示しています。
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
# END WordPress
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とは何か?
RewriteRuleの基本構文
RewriteEngineでmod_rewriteを有効化した後にくるのが、RewriteRuleです。
RewriteRuleもディレクティブ(指示)の1つで、①アクセスしてきたURLに対して、②置換後の(表示する)URLを指定します。その後ろで、③フラグを指定します。
なお、アクセスしてきたURLは基本的に正規表現で記述します。表示するURLでは入力URLの正規表現にマッチする値を変数として使うこともできます。
RewriteRule ①入力URL ②置換後のURL [フラグ]
RewriteRuleの実例
RewriteRuleで使われる実例を見るとその使い方がイメージしやすいかと思います。
RewriteRule ^index\.html$ welcome.html
RewriteRule ^(.+) /other/archive/$1 [R]
RewriteRule ^index\.php$ - [L]
RewriteRule ^index\.html$ /new/index.html [R=301]
RewriteRule ^index\.html$ /new/index.html [R=301, L]
RewriteRule ^/images - [F]
RewriteRule ^/ex/(.*) ${examplemap:$1}
RewriteRule /file/(.*) http://localhost/tmp/$1
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule bar http://example.com/bar [R]
置換後のURLが「-」の場合
RewriteRuleの表記によっては、置換後のURLの部分に「-」と記載されている場合があります。
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
これは、処理の実行後にURLを置換しないということを意味しています。
RewriteRuleの主なフラグ一覧(mod_rewrite)
主なフラグ一覧
RewriteRuleのフラグ一覧の3つ目で指定するのがフラグになります。例えば、上記の例でも [F]
[R]
[E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
といった記述がされています。これが結構重要です。フラグには次のようなものがあります。
なお、フラグは[L]のようにショートコードで書くこともできますし、[last]とロングコードで書くこともできます。
また、RewriteRuleディレクティブのみでなく、mod_rewirteで定義されたフラグのため、RewriteCondディレクティブなどの他のディレクティブでも使用することができます。
フラグ | ロング | 内容 |
---|---|---|
R[=code] | [redirect] | 指定したステータスでリダイレクトを行う。 ・[R=301]:301転送(恒久的) ・[R=302]:302転送(一時的) ・[R]や指定なし:302転送(一時的)・・・デフォルト |
F | [forbidden] | アクセスを禁止にする(403エラーを返す)。 |
G | [gone] | URLを消去済みにする(410エラーを返す)。 |
P | [proxy] | プロキシリクエストを介して処理する。(Proxy) |
L | [last] | 処理を終了する。以降の書き換えは行わない。 |
N | [next] | 表示先のURLを用いて、再度.htaccessの処理を実行する。(Next) 例えば、A を B に置き換え、置き換える As がなくなるまで置き換えを続けるなど。 ※無限ループに陥る場合があるので注意が必要。 |
C | [chain] | ルールをつなげます(チェーンします) 1つ目の条件に適合したら、次の条件へと移ります。チェーン中にマッチしないものが出てきた場合、処理を終了し、チェーンでつながっているすべての条件が無視されます。 RewriteCondは通常直後のRewriteRuleしか適用しませんが、Cフラグを指定することで、次のRewriteRuleにも適用することができるようになります。 |
NC | [nocase] | 正規表現の大文字小文字の区別をせずにパターンマッチを行ういます。 |
NE | [noescape] | & 、?、 # などの特殊文字を16 進数のコードにエスケープしないようにします。例えば置換 URL にハッシュ(#)が含まれている場合、 NE フラグを設定していないと # が %23 にエスケープされてしまい404エラーが発生します。 |
QSA | [qsappend] | 入力URLにクエリ文字列「?」が含まれている場合に、置換URLに「?」部分もそのまま渡します。 デフォルトの[QSA]フラグがない状態では「?」以降は破棄されます。 |
S=数値 | [skip=数値] | 現在のルールがマッチしたら、そこから後にある指定した数字番目のルールをスキップする。 |
E=!環境変数名:値 | [env=VAR:VAL] | 指定した環境変数(VAR)に、対象の値(VAL)を設定する。 |
なお、フラグはこれで全てではなく他にもいろいろとあります。
(参考)APACHE公式 mod_rewriteのフラグ一覧
主な環境変数
Eフラグで指定する環境変数には主に以下のようなものがあります。なお、「HTTP_」というのは、HTTPヘッダーを意味しています。
環境変数 | 内容 |
---|---|
HTTP_AUTHORIZATION | 認証情報です。BASIC認証などがある場合に、ユーザー名やパスワードが入っています。 |
HTTP_USER_AGENT | ブラウザや端末情報です。PCやスマホ、chromeやandroidなどからアクセスしているといった情報がわかります。 |
HTTP_REFERER | 前にいたページのURL情報を取得出来ます。 |
HTTP_HOST | 閲覧しているサイトのドメインです。 |
REMOTE_ADDR | ユーザのIPアドレスです。 |
HTTPS | SSL通信の有無を判定できます。値は on/offです。 |
SERVER_PORT | サーバーのポート番号を取得します。 |
フラグを複数指定する
場合によってはフラグを複数指定する必要があることもあります。そんな時はカンマでつなぎます。
RewriteRule ^index\.html$ /new/index.html [R=301, L]
上記の場合、index.htmlにアクセスしたら、new/index.htmlに301転送(一時的な転送)を行い、これでmod_rewriteの処理を終了するという内容になります。
なお、indexと.htmlの間にあるバックスラッシュはエスケープです。
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]とは何か?
結論
RewriteRuleの構造が分かったところで、実際に記載されている内容を見てみます。
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
結論から言うと、BASIC認証などでユーザー名やパスワード情報などがある場合は、その情報を環境変数「E=HTTP_AUTHORIZATION」に代入するという意味になります。
詳しく解説
まず、入力されたURLが .*
のとき、すなわち、「.」任意の1文字の「*」0回以上の繰り返し(最長一致)とあるので、すべてのURLが対象という意味です。
置換後のURLは「-」となっているので、URLの置き換えを行いません。
また、[E]フラグが記述されています。
E=HTTP_AUTHORIZATION:%{HTTP:Authorization}
これは、HTTP_AUTHORIZATIONという環境変数に、指定した値を設定するという意味です。
%{HTTP:Authorization}
HTTP:Authorizationとは、HTTPのリクエストヘッダーにあるAuthorizationの値になります。
BASIC認証などでユーザー名やパスワードを要求した場合、その値はHTTPのリクエストヘッダーにあるAuthorizationに含まれて送信されます。
RewriteBaseとは何か?
RewriteBaseの基本構文
次に記述されているのがRewriteBaseディレクティブです。
RewriteBaseは、ベースとなるURLを指定しています。.htaccessのファイルがある場所からのパスになります。
RewriteBase パス
実例
例えば、以下のように記述があるい場合は、指定したURLの前に必ず /test/ が入ります。
RewriteBase /test/
これは、対象のWordPressサイトをドメイン名のルートディレクトリではなく、その中のサブディレクトリである「/test/」配下に設置した場合などに記述されます。
特に指定がない場合はルートディレクトリ直下であることを示す「/」のみを記述します。
RewriteBase /
RewriteRule ^index.php$ – [L]とは何か?
RewriteBaseの後に来るのが、RewriteRuleディレクティブです。
RewriteRule ^index\.php$ - [L]
ここでは、入力されたURLが「index.php」にマッチした場合はLフラグで、処理を終了します。置換後のURLは「-」なので、書き換えは行いません。
なお、入力URL冒頭の「^(キャレット)」は先頭の文字の一致、最後の「$」は末尾の文字が一致することを表しています。indexと.phpの間の「¥(バックスラッシュ)」はエスケープで、「.」が正規表現ではなく普通の文字列であることを示しています。
なお、このRewriteRuleディレクティブの上にRewriteBaseディレクティブがあるので、実際の入力URLは /test/index.php を指しています。
RewriteCondとは何か?
RewriteCondとは何か?
次に出てくるのがRewriteCondです。
RewriteCondもmod_rewirteのディレクティブの1つで、RewriteRuleの上に記述することで、指定した条件を満たす場合のみ、その下にあるRewriteRuleを適用して、URLの書き換えと転送を行います。
例えば、次のような3行の記述があるとします。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test/index.php [L]
この場合、1行目のRewriteCondの条件を満たしたら、次のRewriteCondに進みます。2行目のRewriteCondの条件も満たしていれば、3行目のRewriteRuleに進むという意味になります。
RewriteCondの基本構文
RewriteCondは次の3つの要素で成り立ちます。
RewriteCond ①判定対象 ②判定式 (③フラグ)
RewriteCondの①判定対象や②判定式、③フラグの解説は非常に長くなるので、下記を参考にしてください。
RewriteCondを使ったコードの意味
実際に記述されているコードは以下です。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /test/index.php [L]
これは、まず1行目で、入力されたファイル名が、実際にパスが存在し、ファイルでないか(否定)を判定しています。ファイルでない場合に次のRewriteCondに進みます。
2行目で、入力されたファイル名が、実際にパスが存在し、ディレクトリでないか(否定)を判定しています。ディレクトリ出ない場合は次のRewriteRuleに進みます。
3行目のRewriteRuleで、任意の1文字「.」であれば、/test/index.phpに転送し、[L]フラグ(=last)なので処理を終了します。
つまり、「ファイルが存在しない&ディレクトリが存在しない場合は、index.phpへリダイレクトする」という処理になります。