.

Hi, I detected your main language is not Japanese. I have an english version of about me, so please try it!

この投稿は8年半前の記事です。 情報が古くなっている可能性があるので、その点ご了承ください。
2008 年 9 月 1 日 3,265日前)
3,068文字 (読了時間7分)

SPONSORED LINK

先日、お仕事で専有サーバをはじめて借りた。Wordpressにてサイト構築というお仕事だったのだけれど、管理画面に入れないというとんでもない事態が起きた。なんとか解決し、その過程で.htaccessに対する理解が深まったので、どこかで誰かの役に立つかもしれないという恩着せがましい動機でメモ。

.htaccessとはなんぞや

WebサーバアプリケーションであるApacheの設定ファイルの子供みたいなもの。先頭に”.”とついているのは、Linuxの世界では「設定ファイル」という意味らしい。

apacheは本来、httpd.confというファイルで設定を行うのだけれど、場合によってはある特定のディレクトリだけに設定を行いたい場合がある。そういうときは、該当するディレクトリに.htaccessを置いておけばいい。共有サーバなどでは大元のhttpd.confはいじれないので、.htaccessを使って設定することになる。

短所としては、サーバのパフォーマンスが落ちること。.htaccessを許可している場合、Apacheはリクエストがあった場合、該当するすべてのディレクトリに.htaccessがないかどうか、見にいくことになる。たとえば、http://hametuha.com/contents/document/sannya/index.htmlにリクエストがあった場合は、以下のディレクトリを見る。

  1. /home/hametuha/
  2. /home/hametuha/contents/
  3. /home/hametuha/contents/document/
  4. /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を使っていて変なことになったら、やってみてください。

 

SPONSORED LINK

この記事について

この記事はが2008 年 9 月 1 日にWeb制作, プログラミングの記事として公開しました。

フォローしてください

ここで会ったのもなにかの縁。
高橋文樹.comの最新情報を見逃さないためにもフォローをお願いします。
めったに送らないメルマガもあります。