WordPressではパーマリンクの設定をデフォルト以外に変更すると、自動的に.htaccessファイルが生成されます。
この記事ではWordPressが自動生成する.htaccessの内容について、どんな意味なのか一行ずつ解説していきます。
- WordPressで自動生成される.htaccessの内容
- 【WordPress】.htaccessに書かれていることの意味
- 「# BEGIN WordPress」・「# END WordPress」
- 「<IfModule mod_rewrite.c>」・「 </IfModule>」
- 「RewriteEngine On」
- 「RewriteBase /」(「RewriteBase /wp/」)
- 「RewriteRule ^index\.php$ – [L]」
- 「RewriteCond %{REQUEST_FILENAME} !-f」
- 「RewriteCond %{REQUEST_FILENAME} !-d」
- 「RewriteRule . /index.php [L]」(「RewriteRule . /wp/index.php [L]」)
- 【WordPress】.htaccessで行われている処理
WordPressで自動生成される.htaccessの内容
WordPressでは.htaccessが自動で生成されますが、WordPressのインストール先によって若干内容が異なります。
WordPressを公開フォルダ直下にインストールしている場合
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
WordPressを公開フォルダ内の「wp」フォルダにインストールしている場合
※「wp」フォルダはサンプルです。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>
# END WordPress
この「# BEGIN WordPress」から「# END WordPress」までがWordPressによって自動生成されたものです。
よく見るとWordPressのインストール先によって、4行目の「RewriteBase」と8行目の「RewriteRule」のパスの記述が異なります。
ここに書かれているパスの意味も含めて、一行ずつ内容を解説していきます。
【WordPress】.htaccessに書かれていることの意味
「# BEGIN WordPress」・「# END WordPress」
1行目の「# BEGIN WordPress」と10行目の「# END WordPress」はコメント行です。
「#」から始まる行はコメントとして扱われ、何も処理は行われません。
「# BEGIN WordPress」から「# END WordPress」までがWordPressによって自動生成された内容です。
「<IfModule mod_rewrite.c>」・「 </IfModule>」
WordPressによって自動生成されたコードではmod_rewriteを利用します。
mod_rewriteとは要求されたURLをリアルタイムで書き換える機能のことです。
2行目の「<IfModule mod_rewrite.c>」と9行目の「</IfModule>」は、利用環境でmod_rewriteが利用できるかどうかを確認しています。
mod_rewriteを利用できる場合は「<IfModule mod_rewrite.c>」と「</IfModule>」の間に書かれているコードを処理しますが、利用できない場合はこれらのコードは処理されません。
mod_rewriteが利用できない環境でmod_rewriteのコードを実行しようとするとエラーが発生してしまいますので、「<IfModule mod_rewrite.c>」と「</IfModule>」でmod_rewriteの利用可否を確認しています。
「RewriteEngine On」
mod_rewriteの機能を有効化するという意味です。
ここでは使いませんが、「On」の部分を「Off」と記述すれば無効化するという意味になります。
「RewriteBase /」(「RewriteBase /wp/」)
後述する「RewriteRule」で、リダイレクト先となるURLの基準ディレクトリを指定します。
リダイレクト先の指定が相対パスで書かれたときにのみ適用され、絶対パスで書かれたときは適用されません。
特に理由がない場合は、WordPressのインストールディレクトリ(ここでは「/」や「/wp/」)を指定しておきましょう。
「RewriteRule ^index\.php$ – [L]」
要求されたリクエストがindex.phpだった場合は、URLの書き換えを行わず処理を終了するという意味になります。
「^index\.php$」は正規表現でindex.phpを表します。
この行で指定した文字列にマッチするかしないかの判定を行っています。
ここでマッチした場合(要求されたリクエストがindex.phpだった場合)は、その後ろに書き換えるURLを記述します。
しかしここでは「-」と書かれています。
「-」は書き換えを行わないということを表しています。
最後の「L」は、判定にマッチした場合、この行の処理をしたあと以降の処理を行わないという意味になります。
RewriteRuleの書き方
RewriteRuleは書き方によって色々な指定ができますが、基本的な書き方は次のようになります。
RewriteRule パターン 置換文字列 [フラグ]
パターン
- 書き換えを行いたいURLを判定するための正規表現パターンを指定します。
- リクエストされたURLのパス部分(ドメインより下の部分)が判定の対象になります。
例えば「https://○○○.com/aaa/bbb」の場合、「aaa/bbb」が判定対象になります。
置換文字列
- 正規表現パターンがマッチした場合に書き換えられる文字列です。
- この文字列を相対パスで指定した場合は、RewriteBaseで指定したディレクトリがURLの先頭に追加されます。
- 「-」を指定すると書き換えは行われません。
フラグ
- 各種フラグを指定できます。フラグはカンマで区切ることで複数指定することもできます。
- [L]:判定にマッチした場合、その行の処理をしたあと以降の処理を行わない。
- [R=301]:301リダイレクト。[R]とだけ書いた場合は302リダイレクト。
「RewriteCond %{REQUEST_FILENAME} !-f」
あとに続くRewrite処理を行うかどうかの条件判定をしています。
「%{REQUEST_FILENAME}」は要求されたURLが指定するファイル名を表しています。
その後ろの「!-f」は“ファイルがない場合”ということを表しています。
つまり、リクエストされたファイルがない場合、その後ろのRewrite処理を行うという意味になります。
「RewriteCond %{REQUEST_FILENAME} !-d」
これは、上の「RewriteCond %{REQUEST_FILENAME} !-f」と最後の一文字が違います。
「!-f」は“ファイルがない場合”ということを表していましたが、「!-d」は“ディレクトリがない場合”ということを表しています。
つまり、リクエストされたディレクトリがない場合、その後ろのRewrite処理を行うという意味になります。
このようにRewriteCondが複数続く場合は、全てのRewriteCondが条件を満たしている場合のみ、その後ろのRewrite処理を行います。
「RewriteRule . /index.php [L]」(「RewriteRule . /wp/index.php [L]」)
ここでURLの書き換え処理を行います。
RewriteRuleは上でも出てきましたが、ここでは全ての要求されたリクエストをindex.phpに書き換えて処理を終了するという意味になります。
「.(ドット)」は全てのリクエストを表し、「/index.php(/wp/index.php)」はindex.phpを表しています。
【WordPress】.htaccessで行われている処理
.htaccessに書かれている内容を一行ずつ見てきましたが、行われている処理の流れとしては次のようになります。
- STEP 1
mod_rewriteの利用可否を確認する。
- STEP 2
要求されたリクエストがindex.phpだった場合はリクエストの書き換えは行わずそのままindex.phpにアクセスさせる。
- STEP 3
リクエストされたファイルがディレクトリにある場合はそのままそのファイルにアクセスさせる。
- STEP 4
リクエストされたディレクトリがある場合はそのままそのディレクトリにアクセスさせる。
- STEP 5
上記以外の場合は要求されたリクエストを書き換えてindex.phpにアクセスさせる。
このようにWordPressでは、リクエストされたURLに対応するファイルやディレクトリがWebサーバーの公開フォルダにない場合、すべてWordPressへのアクセスとしてindex.phpに転送されます。
WordPressへの入り口としてindex.phpにアクセスさせたあとは、WordPress内部の処理で、設定したパーマリンクと実際に表示すべきURLの紐付きに基づいてページの内容を表示しています。