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などを使いましょう。
Related posts: