web-dev-qa-db-ja.com

複数ドメインのNGINXリダイレクト

私はNGINXと設定全体に非常に慣れていないので、友人の助けを借りて次の設定でサーバーをセットアップすることができました。

    server {
        listen 80;
        listen [::]:80;
        server_name domain.com;
        rewrite         ^       https://$server_name$request_uri? permanent;
}

server {
        listen 80;
        listen [::]:80;
        server_name domain.de;
        rewrite         ^       https://$server_name$request_uri? permanent;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name domain.com domain.de;
        root /var/www/html;
        index index.php index.html index.htm;

メインページ、いくつかのプロジェクトページ、およびいくつかのプライベートページ用に複数のサーバーがあります。リダイレクト時にアドレスバーのTLDを変更したくないので、すべてのTLDに独自のサーバーがあります。今私の答えは、1つのTLDだけにリダイレクトせずに、これらすべての非SSLサーバーを1つの大きなサーバー(1 /プロジェクト)に簡単に移動するにはどうすればよいですか?

例:

Project.com、Project.de、Project.net、およびProject.orgは、これらの非SSLサーバーのうち5つ以上を1つのSSL対応サーバーにリダイレクトしています。 http://project.net に行くとき https://project.net にリダイレクトされます。非SSLサーバーのセットアップが1つしかないため、TLDはまったく変更されません。

私が達成したいのは、ドメインを変更せずに、プロジェクトごとに1つの非SSLサーバーがhttpsにリダイレクトするように構成ファイルを縮小できることです。

                                       :80 Server      :443 Server

http domain.net ---> https domain.net([非SSL 01] ---> [SSL 01])http domain.com ---> https domain.com([非SSL 02] --- > [SSL 01])http domain.de ---> https domain.de([non-SSL 03] ---> [SSL 01])

http project.de ---> https project.de([非SSL 04] ---> [SSL 02])http project.com ---> https project.com([非SSL 05] --- > [SSL 02])など

1
CentrixDE

私が理解しているのは、複数のドメインを1つのドメインにリダイレクトしたいということです。

まず、rewriteの代わりにreturn 301を使用することをお勧めします。この場合、より効率的です。

これはデフォルトのサーバー設定です。リクエストがどの仮想ホストとも一致しない場合に提供されます。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://your-correct-domain.com$request_uri;
}

また、your-correct-domain.comのHTTPトラフィックを受信して​​HTTPSにリダイレクトするようにサーバーを設定します。

server {
    listen 80;
    listen [::]:80;
    server_name your-correct-domain.com;
    return 301 https://your-correct-domain.com$request_uri;
}

そして最後に、あなたがすべての設定を持っているyour-correct-domain.comのHTTPSサーバー。

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your-correct-domain.com;
    root /var/www/html;
    index index.php index.html index.htm;
}

誰かがIPに直接アクセスした場合、この設定はデフォルトのサーバーにサービスを提供することに注意してください。たとえば、サーバーのIPは192.168.100.100であり、誰かがブラウザに入力すると、https://your-correct-domain.comにリダイレクトされます。

デフォルトサーバーは、サーバー/仮想ホストが準備されていないすべてのリクエストをキャッチします。したがって、誰かがdomain.de、my.domain.de、site2.domain-something.com、を要求した場合、それらはすべて永続的に)になりますリダイレクトhttps://your-correct-domain.comに。 301の代わりに2でリダイレクトするオプションもあります。

最後に、作成しているこのセットアップの一部ではない他の仮想ホストがある場合、それは問題にはなりません。 Nginxは最初に仮想ホストが存在するかどうかを確認し、それを最初に提供するため、デフォルトのサーバーはそのために提供されません。

3
jarvis

明確化された質問に対応する回答を更新しました。

この種のリダイレクトは、次のように実行できます。

server {
    server_name _;
    listen 80 default_server;

    return 301 https://$server_name$request_uri;
}

これはデフォルトのサーバーブロックであり、任意のドメイン名に一致します。リクエストで使用されたサーバー名を使用して、301書き換え応答を返すだけです。これはあなたの例が示すことをします。

3
Tero Kilkanen

これが正解です!

server {
    server_name _;
    listen 80 default_server;
    return 301 https://$Host$request_uri;
}

$ server_nameを使用せず、$ Hostを使用します。 301は永続的であり、何かを変更すると、デバイス間でキャッシュされるため修正が難しくなる可能性があるため、必要に応じて302リダイレクトを使用することもできます。複数のリダイレクトを回避するために将来URLを変更する可能性のあるhttpリンクがまだ多くない場合にのみ、301を使用してください。

0
Ryan Kopf