18

各 nginx 構成は幅広いドメインに対して機能しますが、リクエストを最初のドメイン名 (公式のもの) に自動リダイレクトしたいと考えています。

server {
    server_name a.example.com b.example.com;
}

誰かが に入ったらb.example.com/some、 に直接行きたいa.example.com/some

4

3 に答える 3

21

これは、 http://wiki.nginx.org/Pitfalls#Server_Nameの良い例とほとんど同じです。つまり、次の 2 つのサーバーを使用する必要があります。

server {
  server_name b.example.com;
  return 301 $scheme://a.example.com$request_uri;

  # For pre-0.8.42 installations:
  # rewrite ^ $scheme://a.example.com$request_uri? permanent;
}

server {
  server_name a.example.com;
  # Do stuff
}
于 2012-05-10T11:04:40.153 に答える
15

単一のサーバー ブロックでこれを行うには、 if と$server_namevariableを使用できます。

    server_name primary.tld secondary.tld;
    if ($host != $server_name) {
        rewrite ^ $scheme://$server_name permanent;
    }

または、クエリ パラメータを保持するには、次のようにします。

    server_name primary.tld secondary.tld;
    if ($host != $server_name) {
        rewrite ^/(.*) $scheme://$server_name/$1 permanent;
    }

ここでは、ディレクティブ$server_nameの最初の名前であるプライマリ サーバー名を参照し、HTTP 要求で指定されたホスト名を参照します。server_name$host

ifnginx 構成のステートメントは、常に期待どおりに機能するとは限らないことに注意してください。https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/も参照してください

この回答は、同様のアプローチを使用する別の質問に対するこの回答に触発されました。

于 2016-11-03T21:33:00.150 に答える
4

Combined version of @kolbyjack and @Matthijs answers with one server block. This config will redirect all requests with Host header different from example.com and process only example.com requests.

server {
    server_name example.com a.example.com b.example.com;

    if ($host != $server_name) {
        return 301 $scheme://$server_name$request_uri;
    }

    # processing requests to $server_name (example.com) only
    ...
}
于 2020-11-14T14:41:39.193 に答える