WordPressの.htaccessでお約束のように書かれているアレについて解説

WordPressを使っている人なら、.htaccessという名前のファイルを一度は目にしているはず。
しかし、書かれていることが理解できなくて、そっと閉じた人も多いはず。

そこで今回は、WordPressで必須な、.htaccessファイルついて解説します。

.htaccessファイルとは

.htaccessファイルは、例えば

  • 〇〇というページを見に来たら、〇〇というページにリダイレクト
  • wwwをwwwなしに統一
  • http://をhttps://に飛ばす
  • このディレクトリは誰にも見せてはいけない
  • このファイルは検索エンジンに登録しないでほしい

など、Webサイトについての設定を行うファイルです。

ただし.htaccessはApacheというWebサーバー特有の機能なので、最近はやりのNginxなどでは使えません。

ネットなどでWebサイトの設定方法を調べていると「.htaccessを変更すればよい」と書かれていることが多いですが、「Apacheを使っているなら」という前提があることを頭の片隅に置いておきましょう。

WordPressの.htaccessファイル

WordPressの.htaccessファイルには、次のようなコマンドが書かれています。

  • <IfModule mod_rewrite.c>
  • RewriteEngine On
  • RewriteBase /
  • RewriteRule ^index\.php$ - [L]
  • RewriteCond %{REQUEST_FILENAME} !-f
  • RewriteCond %{REQUEST_FILENAME} !-d
  • RewriteRule . /index.php [L]
  • </IfModule>
AFFS Simple Code Viewer
Copy

どのような意味なのか、順を追って、解説します。

  • <IfModule mod_rewrite.c>
  • ・・・
  • </IfModule>
AFFS Simple Code Viewer
Copy

mod_rewriteという機能が使用できるときに、<IfModule mod_rewrite.c>から</IfModule>の間に書かれている処理を行いなさい、という命令です。

サーバーの管理者が、「mod_rewrite使っちゃダメ」と思ったら、使えません。
レンタルサーバーなどでは、ほとんどないと思いますが…

mod_rewriteはApacheの機能で、クライアントから受け取ったURLを、別のURLに変換(リライト)したり、301などのリダイレクトを行ってくれます。

WordPressはパーマリンクの設定次第で同じページでも、いろいろなURLで表現できます。
しかしパーマリンクで設定されたURLは、実際にはサーバー上に物理的に存在しないファイルを指しています。
そのままURLを表示しようとすると、404エラーとなってしまいます。

そこでmod_rewriteが、URLを書き換えて、WordPressの表示を担当しているindex.phpというファイルにアクセスしているのです。

mod_rewrite アドレス変換

  • RewriteEngine On
AFFS Simple Code Viewer
Copy

mod_rewriteの機能を有効にします。
リライト機能を使う時の、おまじないです。

  • RewriteBase /
AFFS Simple Code Viewer
Copy

基準となるドメイン下のURLを指定します。
例えば、RewriteBase /abc/とした場合、http(s)://ドメイン/abc/が基準となります。

サブディレクトリにWordPressの本体をインストールした場合、RewriteBase /abc/のような記述に変更する必要があります。

  • RewriteRule ^index\.php$ - [L]
AFFS Simple Code Viewer
Copy

mod_rewriteで、ここが一番難しい箇所です。
RewriteRuleの後に記述されている条件に一致したら、URLが置換(リライト)されます。

条件は正規表現というルールで記述されています。
ここでは^index\.php$です。

^...文字列の最初から(RewriteBaseより後)
$...最後まで

つまり、http(s)://ドメイン/index.phpと一致します。
ちなみに「.」は、そのまま使用すると^や$と同じように正規表現のメタ文字として扱われます。
\を付けることで、普通の文字として扱うことができます。

次の「-」が置換先のURLです。
この場合は、http(s)://ドメイン/-ではなくて、そのままhttp(s)://ドメイン/index.phpになります。

[L]は、ここで終了という意味です。
つまりURLの変換もなにもしないで、終了となります。

  • RewriteCond %{REQUEST_FILENAME} !-f
AFFS Simple Code Viewer
Copy

RewriteCondは、あとに続くRewriteRuleを実行する条件を指定しています。

%{REQUEST_FILENAME}は、URLをサーバー上のファイル名に置き換えたものです。

-fは、前部の項目、つまり%{REQUEST_FILENAME}という名前のファイルが実際に存在するかどうかをチェックしています。
存在していれば条件一致ですが、否定を表す「!」が指定されているので、存在していないとき条件一致となります。

  • RewriteCond %{REQUEST_FILENAME} !-d
AFFS Simple Code Viewer
Copy

RewriteCondは、複数続けて指定できます。
複数指定しても、適用されるRewriteRuleは、直後に出てきたものだけです。

今回のRewriteCondには、-dが指定されています。
-dはディレクトリがあるかどうかチェックしています。

URLにディレクトリを指定した場合、デフォルトではindex.htmlやindex.phpが表示されます。

  • RewriteRule . /index.php [L]
AFFS Simple Code Viewer
Copy

最後に、index.phpでもなく、実ファイルでもなく、実ディレクトリでもない場合、ディレクトリ直下(RewriteBase /の場合)のindex.phpにリライトされます。

index.phpにリライトされた後は?

mod_rewriteでリライトされると、再度.htaccessが処理されます。
つまり、もう一度先ほどの工程を行うことになり、RewriteRule ^index\.php$ - [L]で処理終了です。

他のリライトがあるときは順番に注意

プラグインなどで.htaccessを書き換え、リライトをしているときは、順番に注意する必要があります。
例えば、SSL化のために、httpからhttpsにリダイレクトするときなどです。

WordPressでの標準的なmod_rewriteの記述は、それ以降に流れていきません。
そのため以降にSSLのリライトを記述しても、実行されることがないのです。

ここで紹介した設定は、一番最後に記述するようにしてみてください。