nginxでWordPressのFancy URL

最近、仕事と趣味のプロジェクトで立て続けにnginxを使う機会があった。nginx + PHPについてこないだエントリを書いたけど、今回はApapcheのmod_rewriteのような機能を使ってWordPressのFancy URLを実現する方法について少し書く。といっても簡単。

参考にしたのはここ(英語)。

■やりたい事

WordPressは以下のURLでアクセスするものとする。

http://www.example.com/blog/

Permalinkは、デフォルトだと以下のURL。

http://www.example.com/blog/?p=xxx

これを以下のようにしたい。

http://www.example.com/blog/index.php/YYYY/MM/entry-name/

■WordPressはmod_rewriteの有無を判断

ちなみに、Apacheを使っていると、WordPressがmod_rewriteの存在有無をチェックして、上記のURLからindex.phpの部分を除いたURLが選択できるようになってるんだけど、nginx上で動かしている場合はmod_rewriteなしと判断されてしまい、選択できるURLはいずれもindex,phpという文字列が含まれたものになっている。

もちろん、nginxでもmod_rewrite相当の事が出来るので、選択肢から選ばずに、自分でindex.php無しのURLを指定する事も出来るはず。

■設定

nginx.confの設定は以下の通り。

# /blog にアクセスされたら、末尾にスラッシュをつける
rewrite ^/blog$ /blog/;
# /blog/ 以下にアクセスされた場合の設定。
location /blog/ {
# ※1
root   /usr/share/nginx/html;
index  index.html index.htm index.php;
# リクエストされたファイルが存在しない場合(※2)
if (!-e $request_filename) {
rewrite ^/blog/(.*)$ /blog/index.php?q=$1 last;
}
}
location ~ .php$ {
root           html;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;
include        fastcgi_params;
}

※1 WordPressのファイルは実際には /usr/share/nginx/html/blog 以下に存在するが、root はあくまで/usr/share/nginx/html と指定する。

※2 例えば、/blog/index.php/YYYY/MM/entry-name/ というURLにアクセスされた場合、/usr/share/nginx/html/blog/index.php/YYYY/MM/entry-name/ というファイルを探しに行くが、存在しないのでこのルールが適用される。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です