先日から動いていたブログの移転作業が完了しました。
って、このページをご覧の方は新URLでアクセスして来ておられるのですから、何を今さらという話ですね。
皆様、今後ともどうぞご贔屓にお願い致します。
以下は自分用メモのような意味合いで、今回行った手順を整理しておきます。
1. サーチエンジンのロボットを排除
robots.txtで新旧それぞれのサブドメインへのアクセスを止めます。
User-agent: *
Disallow: /
2. Googleからインデクスを削除
ウェブマスターツールから[クローラのアクセス]→[URLの削除]→[新しい削除リクエスト]で申請。数時間で完全に削除されました。
3. サーバーのサブドメイン設定を変更
新しいサブドメインをブログが置かれたディレクトリにポイントし、古いサブドメインのポイント先に新しいディレクトリを作成します。新しいディレクトリの中身は空ですから、これにより以前のURLではブログにアクセス出来なくなります。
4. 旧サブドメインのポイント先にエラーメッセージを準備
作成したディレクトリには、更に /error ディレクトリを作成して403と404のページを準備。アクセスがあった際にエラーを返すと同時に、新サブドメインへ誘導するメッセージを記載しておきます。
5. .htaccessの書き換え
新ドメインのドキュメントルートには旧ドメインで使用していた.htaccessをそのまま置きますが、エラードキュメントのURLのみ変更しておきます。
ErrorDocument 404 http://cyber.bonmee.com/error/404.html
ErrorDocument 403 http://cyber.bonmee.com/error/403.html
AddDefaultCharset utf-8
Order Allow,Deny
Allow from allDeny from ***
旧ドメインの方にも.htaccessを置きます。
ErrorDocument 404 http://blog.bonmee.com/error/404.html
ErrorDocument 403 http://blog.bonmee.com/error/403.html
AddDefaultCharset utf-8
Order Allow,Deny
Allow from all
6. 新サブドメインのrobots.txtを書き換え
新しいサブドメインへのロボットアクセスを許可します。ただし、エラーメッセージや画像があるディレクトリへのアクセスは禁止しておきます。
User-agent: *
Allow: /
Disallow: /image/
Disallow: /error/
エラーメッセージがインデクスされても検索結果にゴミが混ざるだけですし、画像をインデクスされても困りますからね。
7. WordPressのブログURLを変更
Dashboardの[Settings]からWordPress addressとBlog addressを変更。これにより、自動生成される内部リンクのサブドメインが新しい方に書き換えられます。
8. 記事内に記述された内部リンクの変更
記事内に貼られた過去記事へのリンクを見直します。が、これは各ページをチェックしながらの手作業ですので時間を要しますね。後になって見落としが発覚しそうな気もします。
9. 外部JavaScriptファイル内の記述を変更
外部JavaScript内に旧サブドメインが記載されていますので、それを新サブドメインに書き換えます。これはEmacsで M-x replace-string を使えば一瞬ですべてが書き換わります。
10. ドメイン内の他サイトから貼られたリンクを修正
www.bonmee.comやgourmet.bonmee.comなどに記述されているブログへのリンクを書き換えます。これも手作業だと非常に面倒な作業になりますが、htmlファイルですからね。コンソールからPerlでプログラムを打ち込んで書き換えれば一瞬です。
# perl
@files= `ls -l`;
foreach $files(@files){
$_ = `cat $files`;
$_ =~ s/blog\.bonmee.\com/cyber\.bonmee\.com/g;
$new = $files + “.tmp”;
`touch $new`;
print $_, $new;
rename $new, $files;
}
C^d
各ディレクトリを `ls -l` でリスティングして cat でファイルを開き、s///でリプレースします。touch で空のファイルを作成して書き換えた内容を出力し、ファイル名に”.tmp”を付加して保存。その後、元のファイル名にリネームします。簡単ですね。
11. リンクして頂いている他サイトへ書き換えの依頼
これは他人様の問題でもありますので、私一人ではどうしようもありませんね。折にふれて、順次お願いに巡回することにします。
ブログを書いていて困ることのひとつに、コメントやピンバックのスパムがあります。
スパムを歓迎する人は少ないと思われますので、その対策は大げさに言えば世界中のブロガーにとってのエンドレスなテーマでしょうね。
私もこまめにスパマーのIPアドレス範囲を割り出して.htaccessで個別にdenyしてはいるのですが、確かにそれは結構な行数になっていたりもしますけれども、あちらさんも心得ていますのでね。定期的にIPアドレスを変えて来ますから、正直「いたちごっこ」は免れません。
そもそも、そんな程度でスパムを撲滅出来るなら誰も苦労しないですよね。それほど世界のスパマーが少ない筈もありませんから。
WordPressにはスパムを検知して隔離するAkismetというプラグインがあります。
1年ほど前に書いたエントリーと重複しますが、このAkismetも単にスパムを隔離するだけで、実は根本的な解決にはなりません。何故ならば、「隔離する」ことと「ブロックする」ことは別だからです。
ほとんどのスパマーは同じコメントをスクリプトで大量に送信しますので、書き込めたかどうかを人が目で見て確認することはありません。あくまでサーバーが返すステータスコードだけを見ており、そこで301や302、あるいは403や404が返れば「失敗」、200が返れば「成功」となります。
Akismetはブロックではなく隔離ですから、サーバーはステータスコード200を返しています。
彼らにとっては通ったコメントが表示されていようがいるまいが関係ないので、これはスパム送信成功を意味し、その該当記事は「今後も送り続ける」対象のリストに残ってしまいます。根本的な解決にならないというのはこの部分です。
じゃあ、どうすればいいか。
スパマーは各記事に配置されているコメントフォームから送信しているのではなく、コメントフォームに書き込んだ時と同じクエリをwp-comments-post.phpに直接送って来ます。ですから「それを止めてしまえ」というのもひとつの考え方ですね。
一口に「止める」と言っても、考えられる方法はいくつかあります。
とりあえず効果がありそうに思えるのは「HTTP_REFERERにブログ本体のドメインを含む場合にポストを許可する」ようphpコードを書き換えること。スパマーが自動送信して来るコメントは大抵referrerを持ちませんから、この方法はかなり有効かと思われます。
ただ、これには大きな問題点がひとつあります。それは「非常に面倒くさい」ことです。
phpコードを書き換える訳ですから、いくつものファイルに分かれているプログラムのすべてに目を通し、矛盾が生じないよう書き換えなければなりません。これだけ考えても余裕で眠くなります。
加えて、WordPressのアップデートを行うたびにその作業が待っています。
自分が書いたプログラムならば全体のブロックダイアグラムはおおむね把握していますが、それでもかなりの面倒な作業になるでしょう。ましてWordPressは他人様が書いたプログラムです。改造したものを売る気ならともかく、ただの日記趣味にそこまでの労力は費やせません。
昔からある古典的な方法としては「wp-comments-post.phpをリネームする」というものがありますね。スパマーはそこへ直接actionしてクエリを送って来るのですから、確かにこれも有効だと思われます。
ただ、この方法にも大きな問題点があります。それは「人の目でソースコードを見られたら一瞬でバレてしまう」ことです。
昔、Perlで書いたCGIにスパムがよく来ていた頃、投稿フォーム部分のコードを外部の.jsファイルに格納してdocument.writeで書き出していたことがあります。
action先をソースコードから消せるため当初は効果がありましたが、そのうち誰かが外部の.jsファイルを見たんでしょうね。一度バレたら後はもうザル状態になり、私はまたコードを書き換えてと、結局は無限ループのいたちごっこになってしまいました。
当然、この方法にも限界はあるということです。
ただ、action先をリネームする方法は、一度ざっと全体のコードを見通せばいいだけ(読む必要はない)ですから比較的簡単ですね。現時点でのデフォルトのアクション先はwp-comments-post.phpですから、そのファイル名が登場する部分がどことどこにあって、という情報だけを掴んでおけば簡単に対処出来そうです。
どのファイルにwp-comments-post.phpという記述があるかを調べるには、コンソールから$ perlを実行して下記のプログラムを打ち込みます。
$ cd wordpress/wp-content/themes/bible-scholar
$ perl
@_ = `ls | grep php`;
foreach $_(@_){
$cat = `cat $_ `;
if($cat =~ /wp-comments-post/){
print;
}
}
C^d
テーマディレクトリにあるファイル名からphpが付くものだけを抽出して配列に格納し、foreachで回しながら`cat`でファイルの中身を吐き出させて$catに格納、wp-comments-postにヒットしたファイル名だけを出力させます。簡単ですね。
これを実行すると、なんとcomments.phpだけがヒットします。あれ?
そういうことなら、この方法が一番お手軽ですね。これにしましょう。かなりベタなやり方ではありますが。
wp-comments-post.phpをリネームするだけでは、action先がnot foundになってコメントポストが出来ません。ですから、まずはそこを書き換えます。
Dashboardから[Appearance]→[Editor]→[Comments.php]で開き、下にスクロールして真ん中付近にありますね。そこのwp-comments.post.phpを、何か適当なファイル名に変更します。hana-mogera.phpでもqawsedrftgyhujiko.phpでも何でも構いません。
次に、ローカルでwp-comments-post.phpを同じ名前にリネームしてからftpで送ります。これでコメントポストを試したところ、問題なく投稿出来ました。
ただ、これで終了という訳ではありません。上に書いた通り、場合によってはスパマーとの「いたちごっこ」が起こり得るからです。
あと、これは私が使用しているBible Scolarというテーマの場合に限った話かも知れません。他のテーマの場合は分かりませんので、上記のperlスクリプトなり他の方法なりで事前に丁寧に調べておく必要はあるでしょう。
以前から悩みの種だった、日本語タグ使用時のタイトル文字化け。
こちらにも詳しく書きましたが、要はタグに日本語を使用した時にタグアーカイブを表示させると、最初の1文字目が文字化けするという現象です。
%tag%という変数をうまくデコード出来ないのが原因ですが、これはAll In One Seo Packというプラグインの不具合によるもの。
以前のバージョンではAll In One Seo Packによるタイトルのリプレースを止めることで回避出来ていました。ですが、現行のバージョンではコードが書き換えられて該当部分が消滅しており、同じ方法が通用しません。
仕方なく、ページタイトルから%tag%を削除して%blog_title%(ブログタイトル=このブログでいうところの “cyber BONMEE” )だけを表示させていました。
そのまましばらく忘れていましたが、何かの拍子にその件をまた思い出したためコードを眺めていたところ、どうやらそれっぽい箇所を発見したため修正を実施。文字化けを回避することが出来ました。
ダッシュボードからプラグインエディタでall_in_one_seo_pack.phpを開きます。
Ctrl+fで”title”という文字を検索しながら下に飛ばして行き、
add_option(”aiosp_tag_title_format”, ‘%tag% | %blog_title%’, ‘All in One SEO Plugin Tag Title Format’, ‘yes’);
という部分を探します。
ここで、’%tag% | %blog_title%’ とある部分が曲者。アポストロフィ ( ‘ ) と日本語の2バイト文字の1バイト目をくっつけてデコードしてしまうようで、ここを離してやれば何とかなるのではと閃きました。
それで、%tag%の前に半角スペースをひとつ挿入。以下のように変更します。
add_option(”aiosp_tag_title_format”, ‘ %tag% | %blog_title%’, ‘All in One SEO Plugin Tag Title Format’, ‘yes’);
これがビンゴ。たったこれだけのことでタイトルの文字化けを回避。アホみたいな話です。
その下にある$search%という変数も文字化けを起こすため、同じようにスペースをひとつ挿入。
私はカテゴリーに日本語を使用していないため無関係ですが、日本語のカテゴリー名を使用しておられる方は%category_title%の前も空けておいた方がいいかも知れません。
このAll In One Seo Packは更新頻度が恐ろしく高いので、アップデートする度にここを書き換える覚悟が必要です。どうせ作者は2バイト文字が化けることなんか気にかけちゃいないでしょうから、どれだけバージョンが上がってもこの点はそのままでしょう。Donateしませんよ(笑)。
それはさておき。
ほんとにね。面倒がらずにコードくらい読んでおく必要はありますね。プラグインやテーマなどはサードパーティが製作するものですから、テーマの作者がドキュメントルートへのパスを勘違いしていたりとか(それでLinkの編集が出来なかったり)しますので、時間を見つけてでもコードは一通り読んでおくべきだと思いました。はい。
それでも多分、私はしないと思いますが。本気で困ってから動くという姿勢は、おそらく死ぬまで直らないものだと思っています。
デジカメで撮影した画像ですが、毎日何がしか撮っていると結構な量になりますので、専用のディレクトリを作成して年/月別に保存しています。
しかし、デジカメから画像をUSB接続でシステムに取り込んだままの状態では、ファイル名のアルファベットが大文字になっていたり、パーミッションが0755になっていたりで気持ちが悪い。
なので、過去のエントリーにも書きましたが、ファイル名を小文字に変換してパーミッションを0644に変更する簡単なPerlスクリプトを書いて、ディレクトリごと連続処理を施しています。
ですが、他にも気持ち悪い点がいくつかありまして。
通常、デジカメで撮影した写真はファイル名に通し番号が割り振られますね。私のシャープ製デジカメの場合だと”SANY1234.JPG”みたいなファイル名で保存されますが、フォーカスが合っていない写真や暗い写真など不要なものを削除すると、当然のことですがその番号が抜けます。
また、何の問題か、写真をすべてシステムに移動して空になったデジカメで新たな写真を撮った際、先に取り込んだ画像と同じナンバーが新しく撮影した画像にも与えられ、ファイル名が重複することがあります。
なので、それらも一気に処理してしまおうと考えました。
これまでは、以下のようなスクリプトで処理を行っていました。
#! /usr/bin/perl
# renjpg
#
@files = glob(”*.*”);
foreach $files (@files) {
($name, $extention) = split(/\./, $files);
chomp($extention);
$extention =~ s/JPG/jpg/g;
$name =~ s/SANY/sany/g;
$new = $name.”.”.$extention;
rename($files, $new);
chmod 0644, $new;
print “$files renamed to $new\n”;
}
exit 0;
globでディレクトリ内のファイルをリスティングし、foreachで回しながらファイル名の大文字を小文字に書き換えて、パーミッションを0644に変更するだけの単純なものです。
これを少し弄って、ファイル名の番号部分がディレクトリ内での通し番号になるようスクリプトを変更します。
@files = glob(”*.*”);
($name,$extention) = split(/\./, $files[0]);
ディレクトリ内のファイル名を配列@filesに格納するのは上記のスクリプトと同じですが、配列@filesの最初のエレメントに格納された画像の番号部分を取得するため、$files[0]のファイル名を”.”(ドット)で分割、それぞれを$nameと$extentionに格納します。
$name =~ s/SANY/sany/;
$name =~ s/sany//;
$extention =~ s/JPG/jpg/;
$nameに格納されたファイル名のうち、”SANY/sany”の文字列を消します。また、$extentionに格納された文字列を小文字に変換します。
これで、”SANY****.JPG”というファイル名からアルファベット部分が取り除かれた4桁の数字だけが$nameに格納され、小文字になった拡張子が$extentionに格納されることになります。
$i = 0;
前のスクリプトではforeachで回しましたが、今回は番号という概念が加わるため、$iをひとつずつインクリメントしながらwhileで回します。ですので、ループに入る前に$iに0を代入して初期化しておきます。
while(<@files>){
if($i == 0){
$num = $name;
}else{
$num = $name + $i;
}
$new = “sany”.$num.”.”.$extention;
rename($files[$i],$new);
chmod 0644, $new;
print “$files[$i] renamed to $new\n”;
$i++;
}
whileで回して、配列@filesのエレメントをひとつずつ順番に処理します。
if文による条件分岐で、$iが0(配列の最初のエレメント)の場合は$nameに格納された数字を、$iが1以上である場合は$nameに格納された数字に$iの値を加算した数字を$numに格納します。
例えば、配列の最初のファイル名が”SANY1141.JPG”だとすれば、$iが0ならば”1141″が、$iが1ならば”1142″が$numに格納されることになります。
その後は$numに小文字の”sany”と、$extentionに代入された小文字の”.jpg”を付け足した文字列を$newに格納し、$files[$i]を$newにrenameし、chmodでパーミッションを0644に変更。$iをひとつインクリメントしてループの上に戻り、配列に格納されたエレメントが無くなった時点で終了します。
#! /usr/bin/perl
# renum
#
@files = glob(”*.*”);
($name,$extention) = split(/\./, $files[0]);
$name =~ s/SANY/sany/;
$name =~ s/sany//;
$extention =~ s/JPG/jpg/;
$i = 0;
while(<@files>){
if($i == 0){
$num = $name;
}else{
$num = $name + $i;
}
$new = “sany”.$num.”.”.$extention;
rename($files[$i],$new);
chmod 0644, $new;
print “$files[$i] renamed to $new\n”;
$i++;
}
exit 0;
これをrenumというファイル名で保存し、パーミッションを0755にしておきます。
デジカメをシステムに接続してファイルをディレクトリに取り込み、画像をチェックして削除するものは削除し、その後でこのスクリプトを走らせればちゃんと通し番号で画像が並び、ファイル名が小文字になり、パーミッションも644になります。
削除されたファイルの分だけ番号が前に詰められることになるため、デジカメのナンバリングがインクリメントされなくても少々のことなら重複が避けられます。
これで更にスッキリしました。(笑)
先日、USBデバイスの謎なところで書いたファイルのパーミッションの問題ですが、他にもうひとつ妙なことが起きておりまして。
シャープ製のデジカメなんですけれども、それまで小文字だったファイル名(sany****.jpg)がすべて大文字(SANY****.JPG)に変わっているんです。ある日突然に。
何があったかは分かりません。ですが、ファイルのパーミッションが0755になるだけでも気持ち悪い上に、.jpgが.JPGに変わっていますので、もう気持ち悪さMAXの状態に。
ですので、簡単なperlスクリプトを書いて、写真が格納されたディレクトリごと処理することにしました。
#! /usr/bin/perl
# renjpg
#
@files = glob(”*.*”);
foreach $files (@files) {
($name, $extention) = split(/\./, $files);
chomp($extention);
$extention =~ s/JPG/jpg/g;
$name =~ s/SANY/sany/g;
$new = $name.”.”.$extention;
rename($files, $new);
chmod 0644, $new;
print “$files renamed to $new\n”;
}
exit 0;
ますは、ディレクトリにあるファイルから拡張子を持つものだけをglob(”*.*”)で抽出し、配列@filesに格納します。
次に、それらのファイルをforeachで回しながらファイルごとに処理するため、ファイル名と拡張子をsplitしてスカラー変数$nameと$extentionに格納。
ファイル名がSANYになっているものをsanyに、拡張子がJPGになっているものをjpgに、それぞれ置換演算子s///で書き換えます。
その後、もう一度ファイル名と拡張子をドットで繋いで$newに格納。後は、元のファイル名$filesを新しいファイル名$newにrenameし、chmodで$newのパーミッションを0644に変更。「できましたよ」というメッセージを吐かせてルーティンの先頭に戻り、次のファイルに対して同じ処理を施します。
これをrenjpgの名前(ファイル名は何でも良かったのですが、”rename jpg“を縮めてみました)で処理するディレクトリに保存し、パーミッションを0755に変更。
コンソールから
# ./renjpg
で実行すればOKです。
もともとパーミッションを一括変更するために書こうかなと思っていたところでデジカメのファイル名の問題が起きたため、両方書いちゃえばいいじゃないかということで。
あースッキリした。(笑)
