暇人じゃない

nginx で WordPress のパーマリンク設定を使用する

環境:

WordPress はパーマリンクを自由に設定できます。 これは Apache の mod_rewrite を .htaccess などで制御している訳ですが、nginx では .htaccess が使用できません。

何もせずにパーマリンクを設定すると、 http://example.com/blog/index.php/2010/10/hello-world/ のような、index.php が入ったアドレスになってしまいます。

どちらにしろ、このまま WordPress を使用するとページによってスタイルが適用されなかったり、 画像が表示されなかったり、画像がアップロード自体できなかったりで、まともに動作してくれません。

ではどうするのか?と言うと、nginx のインストールで作成したサイト用の設定ファイルで Rewrite を設定をして制御するようにします。

nginx の設定

以下が http://example.com/blog で運用する際の設定です。
色々とサイトを廻ったり試行錯誤した結果、このようになりました。ドメイン名などは適宜読み替えてください。

/etc/nginx/sites-available/example.com:

location /blog {
    root /var/www/example.com/public_html;
    index index.php;

    if (-f $request_filename) {
        expires 30d;
        break;
    }

    if (!-e $request_filename) {
        rewrite ^.+?(/wp-.*) $1 last;
        rewrite ^.+?(/.*\.php)$ $1 last;
        rewrite ^ /blog/index.php last;
    }
}

location ~* ^.+.(jpg|jpeg|gif|png|css|js|flv|swf|ico|xml)$ {
    access_log  off;
    expires 30d;
    root /var/www/example.com/public_html;
}

下の部分で静的ファイルの設定を行っていますが、これはどうにかならないものかなぁ、と。
今のところは書いてあるタイプ以外のものを扱う予定はないので良いのですが、いちいち拡張子を書くのは面倒ですね…

WordPress の設定

WordPress 管理画面のパーマリンク設定を開きます。
設定したいパーマリンクを指定するか、カスタム構造に入力します。

最初から設定をカスタム構造に入力するのであれば気にする必要はないのですが、「日付と投稿名」や「月と投稿名」「数字ベース」から選択すると、上記の例でいえば、

http://example.com/blog/index.php/2010/10/sample-post/

と、パーマリンク設定に index.php が付いています。

いずれかを選択すると、カスタム構造にその設定が入力されるので、/index.php を削除してください。

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

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

単純な事なのですが、これに気付かなかったおかげで1時間近く悩みました…
変更を保存すると、以下のように指定したパーマリンク設定でアクセスできるようになります。

http://example.com/blog/2010/10/sample-post/

以上の設定で、普段使用する機能を試していますが、今のところ順調に動いています。 今週末にブログを移行できたらな…と。