文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

GAE/Jで旧ドメインから新ドメインに301リダイレクトする(slim3、play framework)

Google App Engine For Javaで、独自ドメインを割り当てたので、301リダイレクトする方法を調べて実装してみました。
f:id:treeapps:20160521191008p:plain

リダイレクトの方法

最初は以下のUrlRewriteFilterでリダイレクトを試したのですが、slim3の方はURLがjspになってしまったので今回は見送りました。
UrlRewriteFilter - Rewrite URL's in Java Web Application Servers

従って、今回はjavaでガリガリコードを書いてリダイレクトさせました。

リダイレクト対象サイトと環境

tree-tips


Google App Engine For Javaで開発しています。使用フレームワークはslim3です。

tree-maps


Google App Engine For Javaで開発しています。使用フレームワークはplay framework v1.2.5.3 です。

リダイレクトコード

slim3の場合

@Page("/")
public class HogePage extends ScenicPage {
    @Default
    public Navigation index() {
        ・・・・略・・・・
        StringBuffer sb = RequestLocator.get().getRequestURL();
        if (sb != null) {
            String url = sb.toString();
            if (url.startsWith("http://tree-tips.appspot.com")) {
                String redirectUrl = url.replace("http://tree-tips.appspot.com", "http://www.tree-tips.com");
                response.setStatus(301);
                response.setHeader("Location", redirectUrl);
                response.setHeader("Connection", "close");
                return null;
            }
        }
        ・・・・略・・・・
    }
}

slim3の場合はRequestLocatorから現在のURLが取得できます。また、HttpServletResponseはextendsしている親クラスScenicPageのフィールドにあるresponseを直接参照する事ができます。後は普通のservletなので、いつも通りsetStatus・setHeaderで301リダイレクトする事ができます。

play framework v1.2.5.3の場合

public class HogeController extends Controller {
    public static void index() {
        ・・・・略・・・・
        String rawUrl = "http://" + Http.Request.current().host + Http.Request.current().url;
        if (rawUrl.startsWith("http://tree-maps.appspot.com")) {
            String redirectUrl = rawUrl.replace("http://tree-maps.appspot.com", "http://www.tree-maps.com");
            Http.Response response = Http.Response.current();
            response.status = Http.StatusCode.MOVED;
            response.setHeader("Location", redirectUrl);
            response.setHeader("Connection", "close");
            return;
        }
        ・・・・略・・・・
    }
}

playの場合はrequest・responseはHttpクラス配下のRequest・Responseオブジェクトから取得します。このrequest・responseはservletのクラスではなくplay独自のラッパークラスです。従ってserveltの時と微妙に使い方が異なるので注意。

301リダイレクトの確認

chromeで簡単に確認できます。旧ドメインでアクセスして、301リダイレクトされている事を確認してみます。chrome developer toolsを開いた状態で旧ドメインにアクセスします。
f:id:treeapps:20150801005906p:plain
旧ドメインがStatus 301、新ドメインがStatus 200、と表示されていますね。これで問題無く301リダイレクトされている事が確認できます。

Search Consoleでアドレス変更する

Search Console(旧ウェブマスターツール)で、ドメインが変更された事を設定すると、放置するより早くgoogleがドメイン移行処理をしてくれる可能性があります。

f:id:treeapps:20150801010607p:plain
歯車ボタンから「アドレスの変更」をクリックします。

f:id:treeapps:20150801010619p:plain
前述の301リダイレクトが設定されている状態であれば、ここで2番の301の項目がパスできます。301できていないと3番・4番の項目の確認が行えない(ボタンが非活性状態のままになる)ので、アドレス変更の前に事前に301リダイレクトを設定しておきましょう。

雑感

Google App Engineは最近PHPとGOもサポートされ、現在はPython、Java、PHP、GOの4言語がサポートされています。GAEは無料で動的サイトが作成でき、デプロイも超簡単です。

ただし使用できないAPIが沢山あったり、インスタンスが停止(GAEのサーバの問題?)する事が結構あったり、Datastoreが尋常じゃない程遅かったり、インスタンスの未使用状態が続くとスピンダウンしてしまったり、様々な制限があります。

制限は多いですが、やはり動的サイトを無料で動かせる点は魅力的です。PHPが正式サポートされた事で、頑張ってWordPressを動かす事もできるそうなので、皆さんも色々試してみるといいと思います!!

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築