Home JavaScript Greasemonkey PHP

サブディレクトリごとに運用されてたサイトをごっそりとサブドメインに移行した話2016-08-08


1つ前のポスト、このドメインで使っている静的ファイルのホスト先を別ドメインに移行した話の続きの話です。

必要な数だけサブドメインのサイトを立ち上げる

これまでの作業で、GAE 上で新しく WP は動作するようになっていたのですが、旧サーバ (この作業時点ではまだ現役で動いていたサーバ) では、www.otchy.net 配下にいくつもサブディレクトリを作り、それぞれごとに色んなサイトを運営していました。全部同じドメインに置いた方が、www.otchy.net 自体の SEO にも効果があるし、何よりサブドメとかを追加する度に、apache の設定をいじったりするのが面倒だったからですね。新サーバでは WP 単体で動作せせるようにせざるを得なかったし、今ならサブドメをそれぞれに準備するのもさして面倒では無いので、サブディレクトリで運用されてた各サイトはそれぞれ全部、サブドメインに移すことにしました。

具体的な数字で言うと、元々サブディレクトリで運用されてたのは全部で 16 ほどありました。とは言え、作りかけ放置系・すでに動いていない系・目的達成系・そもそもテンポラリ系、を整理してみると、実質パブリックなのが 4 つ、プライベートなのが 1 つだけ残る形でした。パブリックなのは、この新デザインでも右下にリンクを設置してある以下の 4 つです。
このうち、始めの 3 つについては、完全な静的サイト。HTML/CSS/JS さえホストできればそれで動くので、GAE で新しいプロジェクトを 4 つ作り、前述のスクリプトを走らせて、必要なファイルをアップしたらそれだけで簡単に動く…はずでした。ところが、個人の Google アカウントで作成可能な GAE プロジェクトの数は、デフォルトで合計 10 までに制限されているらしく、途中でこれ以上プロジェクトが作れないという事態に陥ってしまいました。過去に GAE/j + Slim3 で遊んでいたときの残骸などもあり、途中で上限に達してしまったのです。

さてそこでどうしたかと言うと、「上限解放したい場合はこちら」的なリンクの先に説明があり、さらに申請フォームがあったので、申請してみることにしました。申請フォームの内容を確認すると、会社名などの入力欄があり、また上限解放したい理由の説明など、申請項目がどう見ても人間が読んで判断するような内容ですし、基本的には企業が利用する事を想定しているようなフォームでした。さらにはクレジットカードの登録も求められていて、つまり、こちらが申請しない限り課金は無いけど、「必要時はいつでもすぐ課金できる状況」でないと、これ以上のプロジェクト作成はゴメンね、という事のようです。

実際のところ、今のブログのアクセス的には無料分を突破するイメージが全く湧かないですし、どのみち、最終的に旧サーバをシャットダウンすることが出来れば、それで月々かかっていた費用も浮く計算になるので、クレカ登録もまあ別に良いかなという感じでした。初期登録時のボーナスで、期間限定ながら $300 分は付けてくれるようでしたし。人が読むっぽいフォームについては、とりあえず自分の GAE 愛について語ってみる事にしました。

申請後、1 日くらいは待つかなーと想像してたんですが、結果としては 1 時間もしないうちにレスポンスがあり、あっさり上限は増えました。申請数をプラス 10 と控えめにしたのが良かったのか、会社名を private にしてたのが良かったのか、GAE 愛が伝わったのか、単にボットで無いことが確認出来れば良かったのか、は分かりませんが、何にせよ拍子抜けするほどあっけなく上限解放されました。

というわけで、これらの GAE プロジェクトに新しくサブドメインを割り当ててやって、新しいサブドメインでサイトが稼働し始めました。

唯一 Select Art だけは、PHP アプリだったので、GAE/py で静的ファイルだけホストするわけに行かず、GAE/php で動かす必要がありました。しかも Select Art はローカルファイルにファイルを書き込む仕様になっていたので、ここを GAE 対応に書き直すのはさすがに面倒くさく、リードオンリーのメンテモードにしてしまう決断をしました。まあ、一発ネタ的要素が強く、ここ数年は新規で作成される作品もほぼ無い、という状況だったので妥当かなと思ってます。一応、過去作品の閲覧だけは問題ないようにスクリプトを修正したのはエンジニアの矜恃と言ったところです。

サブディレクトリからサブドメインへのリダイレクト

この段階で、従来のサブディレクトリのサイトと新しく作ったサブドメインのサイトが、全く同じコンテンツで 2 つ存在している状況という形になってしまいます。これは SEO 的にペナルティを受ける可能性がありますし、これまでの "ページランク" については新サイトに移したいです。またそれ以前の問題で、サブディレクトリを削除したタイミングで、旧 URL が得ていたリンク全てをリンク切れにしてしまうのはダサいです。

なのでまず旧サーバで動いている apache 上で下記の設定をしました。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^cronbuilder/$ http://cronbuilder.otchy.net/ [R=301,L]
RewriteRule ^number-unit-translator/$ http://nut.otchy.net/ [R=301,L]
RewriteRule ^tacj2011/(.*)$ http://tacj2011.otchy.net/$1 [R=301,L]
RewriteRule ^selectart/$ http://selectart.otchy.net/ [R=301,L]
</IfModule>
これによって、www.otchy.net/<sub-directory>/ 向けのアクセスが、<sub-domain>.otchy.net に 301 でリダイレクトされます。この時点で、前述の 3 つの問題、「重複コンテンツ」「ページランク移行」「リンク切れ」が全て解決です。ページランクの移行には、Google のボットが 301 を認識するまでの時間が必要なので、検索結果に表示されるリンクが、旧 URL から 新 URL に変わるまで、少し待ちました。とは言え、1 日もかからなかったと思います。

さて、考えれば当たり前なのですが、この設定、旧サーバでのみ有効です。新サーバでも同様の設定が必要です。うっかり www.otchy.net 移行の直前まで気づかなかったので、作業の時系列的にはこれより後なのですが、関連しているのでここでまとめて説明します。

GAE/php でも、この mod_rewirte と同様の挙動を実現しない限り、サーバの移行は出来ませんが、GAE/php で mod_rewrite を使う事は出来ないので、代わりになるものが無いかドキュメントを探してみました。…が、設定ファイルだけでそういったことを実現する方法は無く、結局自分で書くことにしました。

また上記のようなサブドメインへの移行だけで無く、s.otchy.net へ移動した静的ファイルについても、うっかりの移行漏れを救うためにリダイレクトを設定したいところです。数十分の試行錯誤を経て、下記内容でさっくりと目的が達成できました。

app.yaml (抜粋)
handlers:
- url: /(cronbuilder|number-unit-translator|tacj2011|selectart)/
  script: redirect.php

- url: /(colorpicker|css|gm|img|js|uploads|zip)/.*
  script: static.php
handlers の項目で、サブドメにリダイレクトしたいディレクトリと、s.otchy.net に丸っとアクセスを流したい静的ファイル用のディレクトリをそれぞれ指定します。同じスクリプトで受けても良かったのですが、PHP の中で条件判別するよりこっちの方がスッキリしますよね。

redirect.php
<?php
$domains = array("/cronbuilder/" => "http://cronbuilder.otchy.net/",
    "/number-unit-translator/" => "http://nut.otchy.net/",
    "/tacj2011/" => "http://tacj2011.otchy.net/",
    "/selectart/" => "http://selectart.otchy.net/"
);
$uri = $_SERVER['REQUEST_URI'];
$parsed = parse_url($uri);
$path = $parsed["path"];
$quary = $parsed["query"];
$domain = $domains[$path];
if ($domain) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: " . $domain . ($query ? "?" . $query : ""));
    exit();
}
static.php
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://s.otchy.net" . $_SERVER['REQUEST_URI']);
exit();
久々に、スクラッチから PHP 書きました。書きました、と言える程のものではないですが (PHP の array ってハッシュマップだったんでしたっけ。これは、そうか、どうなんだ?)。とまあ、このシンプルなスクリプトで 301 リダイレクトは実現します。チューリング完全の噂もあり、黒魔術的な扱いをよく受ける mod_rewrite ですが、そこまでのものを用意しなくてもシンプルに、分かりやすく解決できる、という事ですね。

そろそろこのシリーズも大詰めに近づいてきました。次は、WP の中で何をしたか、について話を進めていこうと思います。

カテゴリ: Development タグ: gae