Tags:, Posted in lighttpd Leave a Comment

lighttpd+WordPressにしてみたのは良いものの、パーマリンクがイマイチ。

というのも、apacheのように.htaccessが置けないため、必然的にURLの”index.php”が取り除けないワケで。

やはり、例えばこのページなら

/index.php/2009/05/13/lighttpd/

ではなく

/2009/05/13/lighttpd/

と、したい。

というわけで、mod_rewriteを使って対応してみたメモ。

WordPressの管理画面で設定を変更

[設定]→[パーマリンク設定]で、[日付と投稿名]や[月と投稿名]など、使いたい設定を一度選びます。
次に、[カスタム構造]を選びます。テキストエリアには、直前に選んだ設定の書式が入っています。
例えば[日付と投稿名]であれば、次のような感じ。

/index.php/%year%/%monthnum%/%day%/%postname%/

ここで、先頭のindex.phpを外してしまいたいというのが、今回の目的。
サクッと消してしまいます。

/%year%/%monthnum%/%day%/%postname%/

そして[変更を保存]。
以前にapacheを使っていたなどの理由で最初からindex.phpが入っていない場合、そのまま保存します。

するとWordPressは、次のような.htaccessを作りにいきます。(これはWordPressの設置場所がドキュメントルートだった場合の設定)

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

これを、lighttpd用に設定してやれば良いワケです。

lighttpd.confの設定

lighttpd.confを開き、まずはmod_rewriteを有効にします。
初期状態でコメントアウトされているので、先頭の「#」を消してやるだけです。

server.modules              = (
                                "mod_rewrite",

次に、rewriteの設定をします。
先ほどのapache用のrewrite書式は使えませんので、lighty用に書き直す必要があります。
ここで問題なのは、次の2行。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

これは「ファイルシステム上に指定されたファイル、ディレクトリが存在しなければ」という条件式なのですが、lightyのmod_rewriteにはこれが存在しないようです。
Luaが入っていればmod_magnetで解決できるのですが、このためにインストールするのはいかにもメンドウ。
ここは、ちょっと強引ですがWordPressならではのルール読み替えで対応してしまいます。
つまり、「第一階層の名前が”wp-”で始まっていれば」としてしまうのです。

lighttpd.conf中の次のような箇所を捜します。

#### url handling modules (rewrite, redirect, access)
#url.rewrite                = ( "^/$"             => "/server-status" )
#url.redirect               = ( "^/wishlist/(.+)" => "http://www.123.org/$1" )
#### both rewrite/redirect support back reference to regex conditional using %n

この下に、次のような記述を追加します。

url.rewrite-once = (
  "^/wp-.*" => "$0",
  "^/(.*)" => "/index.php/$1"
)

保存して、lighttpdを再起動すれば完了。

ここで例えばsitemap.xmlとsitemap.xml.gzなどを通すようにするならば、正規表現を書き換えてやります。

url.rewrite-once = (
  "^/(wp-.*|sitemap\.xml(\.gz)?)$" => "$0",
  "^/(.*)" => "/index.php/$1"
)

注意点としては、スラッグなどに”wp-”で始まるものを使わないようにすることです。
これが難しいようなら、wp-contentやwp-adminなどを全て指定するか、まじめにmod_magnetなどを使いましょう。

このエントリーをはてなブックマークに追加
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed
Share on StumbleUpon
Newsing it!

Related posts:

  1. [lighttpd] ExpireとCompressでサイトを高速化

2009 年 5 月 13 日