Webは用いる人のリテラシーで決まる 文学部卒・30代でエンジニアに転向して経験した業界裏話や技術ノート
Twitter Facebook
TOP > BLOG > IT記事

nginxでトップページ以外のアクセスをトップページにリダイレクトするエンジニア向け

早川朋孝 早川朋孝
Webエンジニア
業界15年
nginx

下記の要件でnginxを使って、リダイレクトの設定をする方法をまとめます。nginxの各サブドメインのトップページ以外のすべてのページ(ページが存在しようがしまいが問わず)にアクセスがあった場合に、それぞれのサブドメインのトップページに転送するというものです。

  • ウェブサーバーはnginx
  • サブドメインが複数個ある

設定にはいろいろな方法があるでしょうが、シンプルに正規表現を使って表現しました。トップページ以外のページは必ず固有のURLがあるので、「任意の文字が一文字以上ある」ことをトップページ以外のページであるという判定に使っています。

あとはreturnで転送するだけ。ステータスコードは仮で307としていますが、状況に応じて使い分けるといいでしょう。ちなみに301にすると、後で運用の都合で変更が発生した場合にブラウザのキャッシュに設定が残って修正が事実上できないか、できるにしてもすごく面倒という事態を経験したことがあるので、安易には使わないようにしています。

httpsは$shemeでもいいでしょう。

server {
listen 443;
server_name *.hogehoge.com;
location ~ ^/.+ {
return 307 https://$host;
}
}

なお、この記述だと正規表現が貪欲すぎて配下のcssやjs、画像などのリクエストも転送されてしまうので、少し補強します。下記サンプルでは外部css、js、画像がそれぞれ公開ディレクトリ直下の/css、/js、/imgに入っている想定です。

location ~ ^/.+ {
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などは使えませんが、よほど複雑なことを望まない限りそこそこの処理ができるのです。

nginx: [emerg] unknown directive “if($xxxxx” in /etc/nginx/nginx.conf:61

また、if文の後に半角スペースがないとこのエラーが出てエンジニアをいじめてきます。nginxにはあまりいけずをしないでほしいものです。

正規表現についてよく知らないという人はちゃんと勉強しましょう。ウェブで勉強したいという人はこの記事がおすすめ。
初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」

nginxの仕様については『nginx実践入門』がいいです。初心者エンジニアがつまづきそうな箇所を丁寧にまとめてくれています。世の中には「ITの技術本はすぐ古くなるからなぁ」という人がいますが、基本の部分はそう簡単に変わりません。まずは体系的な勉強をして基礎を押さえることが重要です。それさえしていない人がウェブの記事だけ追いかけるのは、たいてい時間を無駄にすることになるでしょう。

このブログを書いてる人
早川 朋孝

業界15年のウェブエンジニアです。文学部卒で20代はSEO、アクセス解析などフロントの運用を中心に経験しましたが、30代のある時、ひょんなことから一人情シスのような状況を経験することになり、流れでそのままエンジニアに転向しました。プログラムやサーバー管理、数学の勉強などをしなおして、いまではWebのことはフロントからバックエンドまでなんでもできます。

本が好きで月140時間は読書します。このブログではWeb業界で経験してきた業界の裏側、読書で学んだこと、技術ノートなどを書きます。ネコ好きなタバコ嫌いで、明治学院フランス文学科卒。

facebookへ
PAGE TOP