htaccessは非常に便利ですが、いざ間違えると様々な問題を引き起こします。サブディレクトリにインストールする等、結構このhtaccessで引っかかってます。提供するサンプルはマルチサイトでも使えます。

htaccessはどんな時に必要?
htaccessは、wordpressをサブディレクトリにインストールする場合やマルチサイトを構築する場合には必ず必要になります。またセキュリティ上特定のフォルをアクセス制限する場合にもよく使われます。今回はwordpressをサブディレクトリにインストールする場合のhtaccessの書き方と注意点について書きます。
htaccessはWEBサーバ上に設置される特殊なファイルで先頭にドット(.)が必要です。”.htaccess”という感じですね。このドキュメントでは便宜上ドットなしのhtaccessと記述しています。
wordpressをwp以下にインストールする場合、インストール手順は別途資料を作成していますが、ここでは、htaccessファイルの中身について記述します。 仮にwordpressをwp配下にインストールした場合、
ブログのホームへのアクセス | http:example.com |
管理画面へのアクセス | http://example.com/wp/wp-admin/ |
というようになります。
htaccessを設置しないもしくは間違っているとどちらか一方もしくは両方にアクセス出来ないなどの障害を引き起こします。以下にhtaccessのサンプルを示します。wordpressをwp配下にインストールした場合、このサンプルをコピー&ペーストすれば動くはずです。
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) wp/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ wp/$2 [L]
RewriteRule . index.php [L]
# END WordPress
3行目は、リライトエンジンを有効にしています。はじめに1度だけ書いてください
4行目は、ターゲット側のファイルが相対で指定してある場合に適用されるフォルダ位置を指定しています。
5行目は、行頭(^)につづくindex.phpそのままで実行してhtaccessを終了。
8行目は、行頭になんらの名前(フォルダ)がついている場合は、wp-adminは、そのまま実行します。
10行目~12行目は、指定したファイルが実存するファイル(-f)やフォルダ(-d)であればそのまま実行sしてhtaccessを終了
13行目は、先頭(^)の指定フォルダに続くwp-content/wp-admin/wp-include以下は、インストールフォルダwpのものを次項します。
14行目は、先頭(^)の指定フォルダに続くphpファイルも、上記同様にインストールフォルダwpのものを実行する。
※13行目、14行目のインストールフォルダ(wp/)は、マルチサイト構築していない場合は省略可能です。
15行目は、上記のいずれにも該当しない場合のルールで、ルートにあるindex.phpを実行します。
正規表現
.htaccess で使える正規表現です。正規表現は使う言語で多少の食い違いが出る場合があります。この表でよく確認して使ってみてください。
前述したとおり正規表現はRewirteRuleで使います。
文字 | 説明 |
---|---|
. | 任意の1文字 にマッチします。 |
+ | 直前の文字が 1回以上 繰り返す場合にマッチします。 “go+gle” は “gogle” や “google” にはマッチしますが “ggle” にはマッチしません。 |
* | 直前の文字が 0回以上 繰り返す場合にマッチします。 “go*gle” は “gogle” や “google” や “ggle” にマッチします。 |
? | 直前の文字が 0個か1個 ある場合にマッチします。 “go?gle” は “gogle” や “ggle” にマッチしますが “google” にはマッチしません。 |
^ | 直後の文字が行の 先頭 にある場合にマッチします。 “^google” は行の先頭に “google” の文字がある場合にマッチします。 |
$ | 直前の文字が行の 末尾 にある場合にマッチします。 “google$” は行の末尾に “google” の文字がある場合にマッチします。 |
| | 選択肢を区切るために使われます。 “google|googol” は “google” と “googol” にマッチします。 “goog(le|ol)” と表記しても同様の結果を得られます。 |
\ | 直後の “正規表現において特別な意味を持つ” 文字を エスケープ する。 “go\+gle” は “go+gle” にマッチします。 正規表現における “+” の意味を失い “+” 文字として扱います。 |
[] | 角括弧に含まれる文字のいずれか1つにマッチします。 [abcXYZ01] は “a” , “b” , “c” , “X” , “Y” , “Z” , “0” , “1” にマッチします。
角括弧内の文字を “-” を使って範囲指定のマッチもできます。 角括弧内の先頭に “^” を使って含まれない文字のマッチもできます。 |
() | 文字の集合を1つのグループにまとめて扱うことができます。 (google)+ は “google” を1つの単位として評価するため “google” にマッチします。 また、マッチング文字列は後述する “後方参照” として利用できます。 |
{n,m} | 直前の文字、またはグループの桁数を指定してマッチ判定します。 a{3} は a が3桁、つまり “aaa” にマッチします。 a{3,5} は a が3~5桁、つまり “aaa” , “aaaa” , “aaaaa” にマッチします。 a{3,} は a が3桁以上にマッチします。 |
正規表現中で使う定義済みのクラスです。
文字 | 対応する表現 | 説明 |
---|---|---|
\d | [0-9] | すべての数字 |
\D | [^0-9] | すべての数字以外の文字 |
\s | [ \t\f\r\n] | 垂直タブ以外のすべての空白文字 |
\S | [^ \t\f\r\n] | すべての非空白文字 |
\w | [a-zA-Z_0-9] | アルファベット、アンダーバー、数字 |
\W | [^a-zA-Z_0-9] | アルファベット、アンダーバー、数字以外の文字 |
[:digit:] | [0-9] | すべての数字 |
[:lower:] | [a-z] | 小文字のアルファベット |
[:upper:] | [A-Z] | 大文字のアルファベット |
[:alpha:] | [a-zA-Z] | アルファベット |
[:xdigit:] | [0-9A-Fa-f] | 16進数で使われる数字とアルファベット |
[:alnum:] | [a-zA-Z0-9] | アルファベットと数字 |
[:punct:] | [.,!?:…] | 句読点文字 |
[:cntrl:] | (なし) | 制御文字 |
[:blank:] | [ \t] | 空白文字とタブ |
[:graph:] | [^\n\r\f\v] | 印字文字 |
[:space:] | [ \t\n\r\f\v] | 改行を含む空白文字 |
RewriteRuleのフラグ
フラグ | 意味 | 説明 |
---|---|---|
C | Chain | このルールにマッチしたら、次のルールを評価 |
F | Forbidden | アクセス禁止(403-Forbidden)。[L]フラグと同様、以降のルールは無視される |
G | Gone | 削除(410-Gone) |
L | Last | マッチしたらRewriteを止めます。以降のルールは無視! |
NC | No Case | 大文字小文字を無視 |
NE | No Escape | “.”, “?”, “%”などの特殊文字が”%25″のようにデコードされるのを防ぐ |
OR | Or | RewriteCondを複数指定する場合のor指定。指定なしならAND |
PT | Path Through | Rewriteを終了し、それ以外の処理に移行 |
R | Redirect | 指定したURLにリダイレクト。[R=303]のようにリダイレクトコードも付加できる。[L]フラグと同様、以降のルールは無視される |
[C]を指定すれば、RewriteCondの条件を複数のRewriteRuleに適用できる。けど、正規表現の方が速いそうな。
設置後、redirect_toが発生してログインできない
この問題を体験しているユーザは非常に多いようです。
redirect_toのパラメータがサブフォルダを指していないのが原因のようです。以下の”ERR_TOO_MANY_REDIRECTS”の対処方法で解決できます。
