WWW無しへ、HTTPSなどへリダイレクトを行うGo言語コードの紹介と解説

ブログなどのサイトを作っているとHTTPS対応したり、WWW有無のどちらかに統一したい時があります。その場合は統一する方へリダイレクトするわけですが、Go言語でも簡単に行うことが出来ます。

コンテンツの転載は固くお断りいたします。

コードの紹介

以下に www有りから無しへ、httpsへの2つのリダイレクト処理を書いてあります。

httpsへのリダイレクトは、https用以外の『handler』関数内に書いて下さい。https接続で呼び出される handler 関数内に httpsへのリダイレクト処理を書くと無限リダイレクトとなります。

なお、handler関数については『Go言語でシンプルで簡単なHTTPサーバーの作り方』や『Go言語で複数ドメインにも対応可能なHTTPSサーバーの作り方』の記事をご覧ください。


func handler(w http.ResponseWriter, r *http.Request) {
	// www リダイレクト
	if strings.HasPrefix(r.Host, "www.") {
		newURL := strings.Replace(r.Host, "www.", "", 1) + r.URL.Path
		http.Redirect(w, r, newURL, http.StatusMovedPermanently)
		return
	}

	// https リダイレクト
	newURL := "https://" + r.Host + r.URL.Path
	http.Redirect(w, r, newURL, http.StatusMovedPermanently)
}

コードの解説

URL に www が含まれているか調べる


if strings.HasPrefix(r.Host, "www.") {

まずはドメインに『www』が含まれているかどうかを『strings』パッケージの『HasPrefix』関数を使って調べます。『HasPrefix』関数は第一引数で指定した文字列の先頭部分が、第二引数で指定した文字列と一致するかどうかを調べてくれます。

『r.Host』とするとクライアントが要求している接続先ホスト名を取得することが出来ます。例えばブラウザで『https://golang.yufi.jp/test』と入力してアクセスした場合、r.Hostは『golang.yufi.jp』となります。

また『http://golang.yufi.jp:8080/test』にアクセスした場合は『golang.yufi.jp:8080』となります。 ### URL を www なしに置き換える


newURL := strings.Replace(r.Host, "www.", "", 1) + r.URL.Path

『strings』パッケージの『Replace』関数を使って文字列の置換をします。第一引数には元の文字列、第二引数には置き換え対象の文字列部分、第三引数には置き換えた後の文字列、第四引数には置換を実行する回数です。

上記のコードを実行すると r.Host がwww.yufi.jp』だった場合『yufi.jp』へと変換されます。第四引数に『-1』を指定すると無制限に置き換えを行うのですが、1としていなかった場合『www.yufiwww.jp』を『yufijp』と変換する恐れがあります。

最後に『r.URL.Path』を繋げていますが、これは『golang.yufi.jp/test』とアクセスされた場合に『/test』が『r.URL.Path』となります。

リダイレクトする


http.Redirect(w, r, newURL, http.StatusMovedPermanently)

リダイレクトするには『http』パッケージの『Redirect』関数を使います。第一引数に『http.ResponseWriter』第二引数に『http.Request』第三引数にリダイレクト先URL、第四引数にHTTPステータスコードです。

今回は恒久的なリダイレクトをさせるために、HTTPステータスコード『301』である『http.StatusMovedPermanently』を指定しています。

https へのリダイレクト


newURL := "https://" + r.Host + r.URL.Path
http.Redirect(w, r, newURL, http.StatusMovedPermanently)

http から https へのリダイレクトはとてもシンプルです。『r.Host』と『r.URL.Path』の前に『https://』を加えて『RRedirect』関数へ渡すだけです。

ブラウザで例えば『https://golang.yufi.jp/』とすると、https の一般的なポート番号である『443』へ接続されます。自動的にそのように接続させたい場合は以下のようにします。


s := strings.Split(r.Host, ":")
newURL := "https://" + s[0] + r.URL.Path
http.Redirect(w, r, newURL, http.StatusMovedPermanently)

例えば『http://golang.yufi.jp:8080/』にアクセスすると、r.Host には『golang.yufi.jp:8080』が入りますので、ポート番号を消しておく必要がありますよね。

『strings.Split』関数を使用して『r.Host』を『:』で分割します。『s』は『string』のスライスであり1番目に『golang.yufi.jp』2番目に『8080』が入るようになります。

新しいURLを組み立てる際は『https:// + s[0] + r.URL.Path』とします。『s[0]』には『golang.yufi.jp』という文字列が入っています。

終わりに

HTTP のステータスコードを変えれば一時的なリダイレクトにすることも可能です。リダイレクト処理も簡単に行うことが出来るので、皆さんもどんどん使ってみましょう。