先日、お仕事で専有サーバをはじめて借りた。Wordpressにてサイト構築というお仕事だったのだけれど、管理画面に入れないというとんでもない事態が起きた。なんとか解決し、その過程で.htaccessに対する理解が深まったので、どこかで誰かの役に立つかもしれないという恩着せがましい動機でメモ。
.htaccessとはなんぞや
WebサーバアプリケーションであるApacheの設定ファイルの子供みたいなもの。先頭に”.”とついているのは、Linuxの世界では「設定ファイル」という意味らしい。
apacheは本来、httpd.confというファイルで設定を行うのだけれど、場合によってはある特定のディレクトリだけに設定を行いたい場合がある。そういうときは、該当するディレクトリに.htaccessを置いておけばいい。共有サーバなどでは大元のhttpd.confはいじれないので、.htaccessを使って設定することになる。
短所としては、サーバのパフォーマンスが落ちること。.htaccessを許可している場合、Apacheはリクエストがあった場合、該当するすべてのディレクトリに.htaccessがないかどうか、見にいくことになる。たとえば、http://hametuha.com/contents/document/sannya/index.htmlにリクエストがあった場合は、以下のディレクトリを見る。
- /home/hametuha/
- /home/hametuha/contents/
- /home/hametuha/contents/document/
- /home/hametuha/contents/document/sannya/
こういう風にザーッと見ることを「走査」という。これがApacheに対して少し負荷となるらしい。ただ、ほとんどの場合は気にするほどの負荷にはならない。
WordPressのカスタムリンク構造が生成する.htaccess
WordPressにはカスタムリンク構造というものがある。というのも、Googleなどの検索エンジンは、http://hametuha.com/?p=12というような、動的サイトのページを検索対象から外す傾向にあるらしい。なので、「連載小説の方舟謝肉祭第5話」だったら、http://hametuha.com/series/hakobune/5などとした方がよいらしい。
そこでWordpressはそういう機能をカスタムリンク構造として提供しているのだが、この機能は.htaccessを自動生成することにより実装されている。実際に生成される.htaccessはこんな感じ。なお、Wordpressのルートディレクトリが”hogehoge”であるという設定にする。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /hogehoge/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /hogehoge/index.php [L] </IfModule> # END WordPress
これを翻訳すると、以下のようになる。
- IfModule mod_rewrite.c
- URL書き換えモジュールであるmod_rewriteが使えたら
- RewriteEngine On
- 書き換えを可能にして
- RewriteBase /hogehoge/
- 書き換えのルートはWordpressのルートディレクトリ”hogehoge”にして
- RewriteCond %{REQUEST_FILENAME} !-f
- もしもリクエストされたURLが存在するファイルではなく
- RewriteCond %{REQUEST_FILENAME} !-d
- リクエストされたディレクトリが存在しなかったら
- RewriteRule . /hogehoge/index.php [L]
- どんなURI(”.”は正規表現で「なんでも」という意味)を要求されても、/hogehoge/index.phpのページに飛ばす([L]は書き換えが完了したら、他の書き換えルールは無視という意味)
というわけで、Wordpressのカスタムリンク構造というのは、リクエストされたものはすべてルートディレクトリのおindex.phpに飛ばし、リクエストURLのお尻についている文字列を頼りに特定のページを返しているということになる。
管理画面に入れない理由
僕が使っていたサーバの管理画面は、”ルートディレクトリ/controlpanel”というリクエストでアクセスできるものだった。実際には”controlpanel”というディレクトリは存在しないのだけれど、そこへアクセスがあった場合に別のディレクトリに飛ばすという作業を行っていたわけである。つまり、Wordpressが生成した.htaccessが本来ならば別の場所へ飛ばされるはずだった”hogehoge/controlpanel”というリクエストを”hogehoge/index.php”に飛ばしてしまっていたというわけである。
なので、解決法としては、Wordpressの生成した.htaccessに以下の一行を付け加えただけだった。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /hogehoge/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !^.*/controlPanel.* #←これ RewriteRule . /hogehoge/index.php [L] </IfModule> # END WordPress
ようするに、書き換え条件である”RewriteCond”に「リクエストURLに”controlpanel”という文字列を含まなかったら」という条件を付け加えたわけである。これで大丈夫だった。
ちなみに、”!^.*/controlPanel.*”は正規表現。”!”が「でなければ」で、”^”は「文字の先頭」。”.”が任意の一文字で、”*”がつくと「~がいくつでも」になるので、”.*”で「任意の文字列」となる。
専有サーバでは、httpd.confによって管理画面をリダイレクトさせる仕組みになっているものもあるので、Wordpressを使っていて変なことになったら、やってみてください。