下記の要件でnginxを使って、リダイレクトの設定をする方法をまとめます。nginxの各サブドメインのトップページ以外のすべてのページ(ページが存在しようがしまいが問わず)にアクセスがあった場合に、それぞれのサブドメインのトップページに転送するというものです。
- ウェブサーバーはnginx
- サブドメインが複数個ある
設定にはいろいろな方法があるでしょうが、シンプルに正規表現を使って表現しました。トップページ以外のページは必ず固有のURLがあるので、「任意の文字が一文字以上ある」ことをトップページ以外のページであるという判定に使っています。
あとはreturnで転送するだけ。ステータスコードは仮で307としていますが、状況に応じて使い分けるといいでしょう。ちなみに301にすると、後で運用の都合で変更が発生した場合にブラウザのキャッシュに設定が残って修正が事実上できないか、できるにしてもすごく面倒という事態を経験したことがあるので、安易には使わないようにしています。
httpsは$shemeでもいいでしょう。
listen 443;
server_name *.hogehoge.com;
location ~ ^/.+ {
return 307 https://$host;
}
}
なお、この記述だと正規表現が貪欲すぎて配下のcssやjs、画像などのリクエストも転送されてしまうので、少し補強します。下記サンプルでは外部css、js、画像がそれぞれ公開ディレクトリ直下の/css、/js、/imgに入っている想定です。
set $media_file True;
if ($request ~ “(css|js|img)”) {
set $media_file False;
}
if ($media_file = True) {
return 307 https://$host;
}
}
nginxは簡単なif文が使えます。elseやAND、ORなどは使えませんが、よほど複雑なことを望まない限りそこそこの処理ができるのです。
また、if文の後に半角スペースがないとこのエラーが出てエンジニアをいじめてきます。nginxにはあまりいけずをしないでほしいものです。
正規表現についてよく知らないという人はちゃんと勉強しましょう。ウェブで勉強したいという人はこの記事がおすすめ。
初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」
nginxの仕様については『nginx実践入門』がいいです。初心者エンジニアがつまづきそうな箇所を丁寧にまとめてくれています。世の中には「ITの技術本はすぐ古くなるからなぁ」という人がいますが、基本の部分はそう簡単に変わりません。まずは体系的な勉強をして基礎を押さえることが重要です。それさえしていない人がウェブの記事だけ追いかけるのは、たいてい時間を無駄にすることになるでしょう。