趣味エンジニアの技術メモ


GAE MyBlog

GAE でカスタムドメインでない URL 等をカスタムドメインにリダイレクトさせられたらいいなと思ってやってみたのでメモ。

やりたかったこと

こういうドメインにリクエストされた時に、

  • [GAE-ServiceName].appspot.com/*
  • suzukenz.jp/*

このサイトの URL である blog.suzukenz.jp/* へリダイレクトさせたかった。
また、静的コンテンツ(blog)を配信してるだけのサービスなので、アプリの外からなんとかしたかった。(自前の Web アプリの中でルーティングしてればなんとでもできるけど、app engine に任せてるので・・・という話です)

やり方まとめ

でできた。

ただし、http のルーティングにしか対応していないので、例えば https://hogehoge.appspot.com のように https を直接指定されてしまう場合はリダイレクトできませんでした。SEO や URL 直打ちに対しては、やらないよりましになるのかな・・・?今回はこれで良しとしました。

設定方法詳細

上にも書いたように、リダイレクト用の超簡単なサービス(GAE)と dispatch,yaml を作ってデプロイするだけです。
なので、生成物としては

  • app.yaml
  • main.go (go の場合)
  • dispatch.yaml

の3つになります。続きにそれぞれの中身を書いていきます。

app.yaml

あまり難しいことはないです。間違えて default にデプロイしないように、service の指定を忘れないこと。

runtime: go111
env: standard
instance_class: F1

service: redirect

main.go

別にこれを真似しなくてもリダイレクトできれば OK

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
)

func main() {
	http.HandleFunc("/", redirectHandler)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Defaulting to port %s", port)
	}

	log.Printf("Listening on port %s", port)
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

func redirectHandler(w http.ResponseWriter, r *http.Request) {
	url := "https://blog.suzukenz.jp" + r.RequestURI
	http.Redirect(w, r, url, http.StatusMovedPermanently)
}

dispatch.yaml

この URL にリクエストされたら、リダイレクトしたいというのを書く。
記載は、うちの場合の設定。

dispatch:
  - url: 'suzukenz.appspot.com/*'
    service: redirect
  - url: 'suzukenz.jp/*'
    service: redirect

デプロイ

作った redicrect サービス(GAE)と、dispatch.yaml をそれぞれデプロイすれば OK

gcloud app deploy --project $(GCP_PROJECT_ID)
gcloud app deploy --project $(GCP_PROJECT_ID) dispatch.yaml

以上です。お疲れ様でした。