.htaccessは、WEBサーバーとして利用されているApacheの設定ファイルです。
WordPressインストールフォルダの.htaccess
.htaccessは、最近高速化のためにWEBサーバーとして採用されることが多くなってきたLightspeedと互換性があります。【※1】
ApacheやLightspeedが稼働するWEBサーバーにWordPressをインストールすると、.htaccessにWordPressが起動するためにIndex.phpへリダイレクトするコードが書き込まれます。
このページでは、WordPressインストール時に書き込まれた.htaccessの内容に絞り確認していきます。
WordPressによって生成された記述
WordPressは、インストール時にインストールフォルダ.htaccessに下記のコードを書き込みます。
これは、全てのhttpリクエスト時で、インストールフォルダーにあるindex.phpに制御を渡すための記述です。
WordPress起動の詳細は、「WordPressはどうやって起動する」を確認してください。
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
RewriteEngine On
mod_rewriteモジュールが有効になると、正規表現ルールに基づいてURLを動的に書き換えたりリダイレクト処理が行えるようになります。
Apacheモジュール機能の一つであるmod_rewriteモジュールを有効にします。
RewriteRule
指定した正規表現パターンに一致した場合に URL のリライトを実行します。
RewriteRuleの構文は、下記の形式になります。
RewriteRule 正規表現パターン 置換URL [フラグ]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
「.」は任意の1文字。「*」は直前の文字が 0回以上 繰り返す場合。
「(.*)」:任意の文字が0回以上ある場合。
[E=変数名:値] 変数名であらわされる環境変数に値を設定する。
全てのアクセスで、環境変数=HTTP_AUTHORIZATIONにAuthorization ヘッダー(HTTP通信で
認証を行うための値)を設定する。
RewriteBase
.htacessがあるディレクトリを基準ディレクトリに設定する。(URL書き換えにおいて、ベースとなるディレクトリを明示的に指定する)
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule : 正規表現パターンにマッチしたら全体を置換URLに置き換える。
「^」:直後の文字列が行の 先頭 にある場合にマッチ。
「$」:直前の文字列が末尾 にある場合にマッチ。
「L」:マッチするとそれ以降のruleは実行しない。
「\」:直後の "正規表現において特別な意味を持つ" 文字を エスケープ する。
「-」:置換を禁止する。
index.phpに一致すると書き換えを行わず処理を終了する。(無限ループの防止)
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond : RewriteRuleでURL のリライトやリダイレクトを行うルールの定義をする文(if文の働き)。
%{REQUEST_FILENAME} : ファイルやスクリプトのフルパスの入った変数。 「!」: 否定。 「-f」: 実際に存在しファイルの場合にtrue リクエストの入った変数がファイルではない場合に真となる。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond : RewriteRuleでURL のリライトやリダイレクトを行うルールの定義をする文(if文の働き)。
%{REQUEST_FILENAME} : ファイルやスクリプトのフルパスの入った変数。
「!」: 否定。
「-d」: 実際に存在しディレクトリだった場合にtrue
リクエストの入った変数がディレクトリではない場合に真となる。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule : 正規表現パターンにマッチしたら全体を置換URLに置き換える。
直前にRewriteCondがある場合はのRewriteCondの実行結果に基づいて処理を行う。
(RewriteCondが真の場合は処理を実行。偽の場合は処理を行わない。RewriteCondが連続している場合は、両方のRewriteCondが真でないと処理は行わない。)
「.」:すべての条件を現す正規表現。
「/index.php」:置換対象。
「L」:マッチするとそれ以降の処理は実行しない。
すべてのリクエストが/index.phpに書き換えられる。
RewriteRule . /index.php [L]
書き換えが行われた場合、.htaccessが先頭から再実行される。
.htaccessの再実行
RewriteRuleで、置換が行われた場合は「L」の指定があっても.htaccessが再実行される。
再実行の仕様は公式サイトのL|last欄を参照。
【参考サイト】
.htaccess RewriteCond, RewriteRule, 各種一覧表 | いちりのテクの部屋
【※1】Nginxでの.htaccessの扱い。
Nginxは、パフォーマンス向上の観点から.htaccessを使用していません。
理由は、Nginx公式サイトのApache のように: .htaccessをご確認ください。