サブディレクトリインストール型wordpressのhtaccessサンプルと書き方メモ

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

Initializing...

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行目は、ターゲット側のファイルが相対で指定してある場合に適用されるフォルダ位置を指定しています。

以下、適用されるファイルの取扱をRewriteRuleで記述し、その上のRewriteCondがIf文となる条件を書きます。もし条件が一致すれば直後の1行を実行します。また行末([]の中)は、リダイレクトなどのhtmlステータスコードと”L”はもしその行を実行したら終了するというディレクティブです。また、RewriteRuleでは正規表現を使うことが出来ます

5行目は、行頭(^)につづくindex.phpそのままで実行してhtaccessを終了。
8行目は、行頭になんらの名前(フォルダ)がついている場合は、wp-adminは、そのまま実行します。

[_0-9a-zA-Z-]+/は正規表現で、英数小文字と大文字と”_”アンダバーで構成されるフォルダ名+”/”という名前を指定しています。()でくくると後で$XXで参照することができます。

10行目~12行目は、指定したファイルが実存するファイル(-f)やフォルダ(-d)であればそのまま実行sしてhtaccessを終了
13行目は、先頭(^)の指定フォルダに続くwp-content/wp-admin/wp-include以下は、インストールフォルダwpのものを次項します。
14行目は、先頭(^)の指定フォルダに続くphpファイルも、上記同様にインストールフォルダwpのものを実行する。
※13行目、14行目のインストールフォルダ(wp/)は、マルチサイト構築していない場合は省略可能です。
15行目は、上記のいずれにも該当しない場合のルールで、ルートにあるindex.phpを実行します。

 

一度、htaccessを設置した経験があれば、下記の正規表現とディレクティブの資料があれば大丈夫とおもいますので、掲載します。

正規表現

.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” にマッチします。

角括弧内の文字を “-” を使って範囲指定のマッチもできます。
[a-cX-Z0-1] は “a” , “b” , “c” , “X” , “Y” , “Z” , “0” , “1” にマッチします。

角括弧内の先頭に “^” を使って含まれない文字のマッチもできます。
[^abc] は “a” , “b” , “c” 以外の文字にマッチします。

() 文字の集合を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のパラメータがサブフォルダを指していないのが原因のようです。だれが解決方法知っていたら教えてください。

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサーリンク
ページ上部へ戻る