カテゴリー名に濁点を含んだ日本語が使えない問題を解決する(Rsyncのiconvオプションを使う)

このブログで、カテゴリーに濁点を含んだ日本語を使うと、カテゴリーの一覧などからカテゴリーのページにリンクしたとき、 404エラーになってしまう問題が起きました。

原因は、このブログの開発環境にありました。

このブログは静的コンテンツなのですが、次のような手順でブログを運営しています。 (Rakefileで自動化されていますが、内部ではこうなっています)

  • ローカル(Mac OS X)でブログを生成する。
  • サーバ(Ubuntu)にRsyncで生成したブログをアップロードする。

Mac OS X では、ファイル名のエンコードにUTF-8-MACを使っているので、 そのままアップロードすると、サーバ上のファイル名もUTF-8-MACになります。 しかし、ファイル自体のエンコードはUTF-8でURLをパーセントエンコーディングしていないので、 リンク先が見つからなくなってしまうようです。

UTF-8-MAC問題について詳しく知りたい人は、こちらなどが勉強になるとおもいます。

解決方法は簡単で、Rsyncでアップロードするときに、--iconvオプションを使い、 ファイル名をUTF-8-MACからUTF-8に変換すれば治ります。

Rsyncのバージョンを3にする

Rsyncの--iconvオプションが使えるのは、Rsync3からなのでアップデートします。

# brew tap homebrew/dupes #リポジトリを追加(2019/06/20追記。この手順は不要になりました。)
brew install libiconv #iconvオプションを使うために必須のよう
brew install rsync

念のため、サーバ側(Ubuntu)のrsync3にします。

aptitude install rsync

Rakefileを修正する

Rakefileok_failed system...の行を書き換えます。

desc "Deploy website via rsync"
task :rsync do
  exclude = ""
  if File.exists?('./rsync-exclude')
    exclude = "--exclude-from '#{File.expand_path('./rsync-exclude')}'"
  end
  puts "## Deploying website via Rsync"
  #ok_failed system("rsync -avze 'ssh -p #{ssh_port}' #{exclude} #{"--delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}")
  ok_failed system("rsync --iconv=UTF-8-MAC,UTF-8 -avze 'ssh -p #{ssh_port}' #{exclude} #{"--delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}")
end

完。

これでうまくいきました。

[gam0022@starlight:~/git/gam0022.net] $ rake deploy
## Deploying website via Rsync
sending incremental file list
deleting blog/categories/ゴ/index.html
deleting blog/categories/ゴ/atom.xml
deleting blog/categories/ゴ/
blog/categories/ゴ/
blog/categories/ゴ/atom.xml
blog/categories/ゴ/index.html

sent 11206 bytes  received 138 bytes  7562.67 bytes/sec
total size is 2309599  speedup is 203.60
OK

「ゴゴゴゴ…」

comments powered by Disqus

gam0022.net's Tag Cloud