Learning site for website creation

WordPressの「.htaccess」を読み解く

  • 投稿日:2018年11月22日

.htaccessとは

Webサーバをディレクトリ単位で制御するファイルです。

「.htaccess」ファイルを設置したディレクトリ、サブディレクトリに効果があります。

リダイレクトやベーシック認証(パスワードをかける)などの設定を指定することができます。

WordPressではリダイレクトに使用しています。

WordPressの.htaccesss

WordPressをインストールすると以下の「.htaccess」ファイルが生成されます。

「# BEGIN WordPress」から「# END WordPress」までがWordPressによって記述されたものです。

記述されている内容は「ファイルが存在したらそのまま表示、ファイルが存在しなかったらindex.phpにリダイレクトさせて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

公開フォルダ内にフォルダをごとインストールした場合

「RewriteBase」と一番下の「RewriteRule」が変更されています。

「公開フォルダ/lesson1」フォルダの場合

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /lesson1/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /lesson1/index.php [L]
</IfModule>

# END WordPress

IfModule mod_rewrite.c

サーバによる「mod_rewrite(リダイレクト処理)」が利用できる場合だけ中の記述を処理します。

※mod:「Modification」改造・修正

<IfModule mod_rewrite.c>

</IfModule>

RewriteEngine On

「RewriteEngine On」は「mod_rewrite(リダイレクト処理)」を有効にします。

# 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

RewriteBase

リダイレクト先が相対パスの時の基準ディレクトリを指定します。リダイレクト先が絶対パス(先頭が「/」)の場合は適用されず無視されます。

またリダイレクト元への適用もありません。

「RewriteBase /」でリダイレクト先が相対パスの時にドキュメントルートを起点にします。

今回はリダイレクト先が「-(書き換えしない)」と「/index.php(絶対パス)」なのでなくても問題なさそう。

# 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

RewriteCond %{REQUEST_FILENAME} !-f

「RewriteCond」はRewrite(リダイレクト処理)する際の条件を指定します。

RewriteCond %変数名 条件

# 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

「%{REQUEST_FILENAME}」が「!-f」の時に条件が満たされます。

「%{REQUEST_FILENAME}」は環境変数でリクエストされたファイルの名前が代入されています。

「-f」はファイルの場合に「TRUE」、ファイル以外は「FALSE」を返します。

条件に「!」がついているので結果が反転します。

「!-f」はファイルの場合に「FALSE」、ファイル以外は「TRUE」を返します。

つまりURLでリクエストされた場所にファイルがあれば「FALSE」、なければ「TRUE」を返します。

RewriteCond %{REQUEST_FILENAME} !-d

# 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

「RewriteCond」が続けて複数記述された場合は、各条件を「AND」でつないだことになります。
※フラグをつかうと「OR」条件にすることもできます

「%{REQUEST_FILENAME}」が「!-d」の時に条件が満たされます。

「-d」はディレクトリの場合に「TRUE」、ディレクトリ以外は「FALSE」を返します。

条件に「!」がついているので結果が反転します。

「!-d」はディレクトリの場合に「FALSE」、ディレクトリ以外は「TRUE」を返します。

つまりURLでリクエストされた場所がディレクトリであれば「FALSE」、ディレクトリでなければ「TRUE」を返します。

RewriteRule . /index.php [L]

「RewriteRule」は条件「RewriteRule」が満たされた時にリダイレクト処理します。

RewriteRule リダイレクト元正規表現 リダイレクト先 [フラグ]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

リダイレクト元は正規表現によるパターンで記述されており、「.」はどのようなパスでもマッチすることを意味します。つまりどんなURL(リクエスト)でもリダイレクトします。

リダイレクト先は「/index.php」となり、条件「RewriteCond」にマッチしたすべてのURL(リクエスト)を「/index.php」で処理します。

フラグ[L]はLastを意味し現在のルール適用後は次行以下に処理があっても適用しないことを意味します。

「RewriteCond %{REQUEST_FILENAME} !-f」

例えばリクエストしたURL「http://localhost/news/index.html」の場所に「index.html」のファイルがあれば「FALSE」が返り、次に続くリダイレクト処理を実行せず「index.html」を表示します。

ファイルがない場合はリダイレクト処理を実行しドキュメントルートの「/index.php」を実行します。

RewriteCond %{REQUEST_FILENAME} !-d

例えばリクエストしたURL「http://localhost/news/」の場所に「news」ディレクトリがあれば「FALSE」が返り「news」ディレクトリを表示します。次に続くリダイレクト処理を実行しません。

ディレクトリがない場合はリダイレクト処理を実行しドキュメントルートの「/index.php」を実行します。

RewriteRule ^index\.php$ - [L]

「RewriteRule」の前に条件「RewriteCond」が記述されていないので無条件に「RewriteRule」命令を実行します。

リダイレクト元正規表現の対象箇所はどの部分?

リダイレクト元正規表現の対象箇所は「.htaccess」が設置されているディレクトリ以降のパスになり、先頭の「/」とクエリ文字列は含みません。

例)「.htaccess」がドキュメントルートに設置されている場合

リダイレクト元URL:http://localhost/sub/test.html

リダイレクト元正規表現の対象箇所:sub/test.html

 

RewriteRule リダイレクト元正規表現 リダイレクト先 [フラグ]

パターン「^index\.php$」はURL(リクエスト)のリダイレクト元が「index.php」であることを意味します。

リダイレクト先「-」は書き換えをしないことを意味します。

フラグ[L]はLastを意味し次行以降の処理を適用せず終了します。

# 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

この記述はなくても問題なさそうですが、リダイレクト後に6,7,8行目の処理を再度実行することを阻止している役目かと思います。

「http://localhost/news/」に「news」ディレクトリがない場合6,7行目条件が共にマッチし8行目で処理を「http://localhost/index.php」へリダイレクトします。

リダイレクトされると内部的にURLが「http://localhost/index.php」に書き換わっているので再度「.htaccsess」が実行されます。

2度目の「.htaccsess」処理時は5行目がマッチしてそのまま「http://localhost/index.php」を実行します。

結果6,7,8行目の処理を実行せずにすみます。

 

今回のリダイレクトの場合、リクエストURLはそのままで内部的な処理をリダイレクト先に渡します。