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/ というファイルを探しに行くが、存在しないのでこのルールが適用される。