nginx:「server_name」の解決順序?


8

nginx.confに複数の「サーバー」ブロックがあります。ドキュメントは、server_nameマッチングが行われる順序について間違っているようです。

私のconfは次のようになります:

server {
  listen 80
  server_name domain.com *.domain.com

  # do stuff
}

server {
  listen 80
  server_name sub.domain.com *.sub.domain.com

  # do something else
}

ドキュメントで最初のサーバーに送信する必要があると示されている場合、host = www.sub.domain.comのリクエストが正しい場所(2番目のサーバー)に送信される理由を理解しようとしています。

Nginxのドキュメントでは、サーバーブロックの一致が「順番に」チェックされることを示しています。つまり、ホスト* .sub.domain.comでの要求はすべて、2番目のサーバーではなく、最初のサーバーでキャッチする必要があります。(http://wiki.nginx.org/HttpCoreModule#server_name

また、*ワイルドカードは任意の数のサブドメイン部分と一致するため、*。domain.comはwww.sub.domain.comと一致します。(http://nginx.org/en/docs/http/server_names.html#wildcard_names

このドキュメントが間違っている場合、実際に一致する順序は何ですか?

回答:


18

nginxのドキュメント(http://nginx.org/en/docs/http/server_names.html)から:

名前で仮想サーバーを検索するとき、名前が指定された複数のバリアントに一致する場合、たとえばワイルドカード名と正規表現の両方が一致する場合、最初に一致するバリアントが次の優先順位で選択されます。

  1. 正確な名前
  2. アスタリスクで始まる最長のワイルドカード名、たとえば「* .example.org」
  3. アスタリスクで終わる最長のワイルドカード名。例:「mail。*」
  4. 最初に一致する正規表現(構成ファイル内の出現順)

2

ドキュメントは言う:

着信HTTPリクエストのHostヘッダーをNginx構成ファイルのサーバー{...}ブロックと比較し、一致する最初のものを選択します。

発生しているように見えるのは、すべてのserverブロックから最適な一致が選択されるためwww.sub.domain.com、2番目の構成に一致することです。私にはそれをバックアップするドキュメントがないので、いくつかのテストを実行してその動作を確認できます。名前解決について話しているこのドキュメントもあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.