WordPress on Herokuでパーマリンクをカスタマイズする方法(あるいはnginxのrewriteルール設定方法)

WordPress on Heroku (nginx) でカスタムパーマリンクを設定する方法を説明する

WordPress on Herokuなら無料でWordPressブログを開設できる

紆余曲折を経て、ブログをWordPressに戻した。
ホスティングはHerokuを利用して無料で運営する魂胆だ。

インストールやデプロイはWordPressの日本語版をHerokuに設置する方法を参考にすると問題無く完了したが、過去の記事へのリンクをNot Foundにしないようにパーマリンク構造を引き継ごうとすると上手くいかなかった。

問題点はカスタムパーマリンクを設定すると記事ページが見られない

記事のリンクURLが
/?p=111といったパラメータ形式であれば問題無くHerokuでもWordPressが動いたのだが、
/category/year/monthnum/day/postnameなどのカスタムパーマリンクを設定するとトップページ以外が404 Not Foundになってしまった。

nginxのrewriteルールは.htaccessでは変更できない?

WordPress on HerokuのGitHubで指定されているように.htaccessを修正しても状況は変わらず。

.htaccess

# BEGIN WordPress

<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</ifmodule>

# END WordPress

そもそも.htaccessのrewriteルールが効いてないのでは?と思い、HTTPサーバのnginxの設定ファイルを確認してみることに。

conf/nginx.conf.erbにそのものズバリのコメントが書いてあった

冒頭のWordPress on Herokuでは、Herokuのbuildpackとしてiphoting/heroku-buildpack-php-tylerを利用しているが、ここで読み込まれているnginx用の設定ファイルは自分のgitリポジトリに適切にコピーして書き換えると上書きできる。

方法は、自分のgitリポジトリに
confディレクトリを作り、そこに設定ファイル (
nginx.conf.erb) を置く。

設定ファイルのオリジナルを取得してディレクトリに置く

% mkdir conf
% cd conf
% wget https://raw.github.com/iphoting/heroku-buildpack-php-tyler/master/conf/nginx.conf.erb

nginx.conf.erbでコメントアウトされている部分を有効化

rewriteルールが書かれている部分を探し、コメントアウトされている箇所を以下のように直して保存。Herokuへデプロイしたら404 Not Foundは解消されてちゃんと見られるようになった。

    location / {
      # wordpress fancy rewrites
      if (-f $request_filename) {
        break;
      }
      if (-d $request_filename) {
        break;
      }

      rewrite         ^(.+)$ /index.php?q=$1 last;

      # Add trailing slash to */wp-admin requests.
      rewrite         /wp-admin$ $scheme://$host$uri/ permanent;

    #  # redirect to feedburner.
    #  # if ($http_user_agent !~ FeedBurner) {
    #  #   rewrite ^/feed/?$ http://feeds.feedburner.com/feedburner-feed-id last;
    #  # }
    }

HerokuでFacebookアプリをつくるときの初期設定

heroku config

heroku config:add """FACEBOOK_APP_ID""" =000000000000000
heroku config:add FACEBOOK_SECRET=26cae7718c32180a7a0f8e19d6d40a59
heroku config:add LANG=ja_JP.UTF-8

database settings

Herokuのデータベース情報を
config/database.yml

用に抽出する。

ruby lib/get_pgdb_config.rb `heroku config -s |grep SHARED_DATABASE_URL`

lib/get_pgdb_config.rb

#!/bin/env ruby
# -*- coding: utf-8; mode: ruby; -*-
require "yaml"

if ARGV.size == 1
  config = {}
  database_url = ARGV.shift
  params = database_url.split("/")
  username = params[3]
  host = params[2].split("@")[1]
  database = username
  password = params[2].split("@")[0].split(":")[1]
  config["production"] = {
    "encoding" => "unicode",
    "adapter" => "postgresql",
    "username" => username,
    "port" => 5432,
    "host" => host,
    "database" => database,
    "password" => password
  }
  puts config.to_yaml
else
  puts "[USAGE] #{__FILE__} SHARED_DATABASE_URL"
end

Lokka on Herokuを公開ブログにして、開発環境もローカルに作る方法

レポジトリからCloneする

% git clone git://github.com/lokka/lokka.git lokka-heroku

公開用のローカルリポジトリを作ってHerokuへPush

% git checkout -b production
% git push heroku production:master
% heroku rake db:setup

開発用のローカルリポジトリを作る

% git checkout -b dev

このリポジトリで作業する。
ローカルコミットは適宜。

本番に公開する

ローカルリポジトリproductionにdevをマージする

% git checkout production
% git merge dev

productionをherokuにpush

% git push heroku production:master