ホストに基づいて nginx ルート パスを設定する方法

ホストに基づいて nginx ルート パスを設定する方法

訪問者ホストが Nginx で特定のルート パスを使用するように設定するにはどうすればよいですか?

IP 1.1.1.1の訪問者は

root /srv/web1

他のすべての訪問者は

root /srv/web2

答え1

この質問は、少し調べてドキュメントを読むだけで簡単に答えられます(できれば初心者ガイドその後nginxがリクエストを処理する方法)、とにかく答えます。

複数のネットワーク インターフェイスと IP アドレスを持つサーバーがあり、1.1.1.1 アドレスが 1 つのインターフェイスに割り当てられ、他のアドレスがそれぞれのインターフェイスに割り当てられていると想定します。

Nginxはこの点で非常に柔軟です。実際、servernginxが他のサーバーブロックと一致しない場合にデフォルトとして使用されるブロックが常に存在しますserver_name。これはファイルの最初のブロックか、ディレクティブでserver指定されているブロックです。覚えておいてください。default_serverlistenlistenディレクティブでIPを指定できる

つまり、あなたの場合は次のようになります。

server {
    listen 80 default_server;
    root /srv/web2;
    [...]
}
server {
    listen 1.1.1.1:80;
    root /srv/web1;
    [...]
}

上記の例でわかるように、最初のserverブロックはポート 80 のすべてのインターフェイスをリッスンしますが、2 番目のブロックはポート 80 の 1.1.1.1 インターフェイスのみをリッスンします。したがって、1.1.1.1 ネットワーク インターフェイスを介してサイトにアクセスするユーザーは、HTTP 要求のホスト フィールド (つまり、URL バーに記述されたドメイン名) とは関係なく、/srv/web1 からファイルを受信します。

server_name次のようにディレクティブ に IP アドレスを指定すると、同様の動作を実現できます。

server {
    listen 80;
    server_name 1.1.1.1;
    [...]
}
* この最後のserverブロックは、ドメイン名ではなく、リテラル IP アドレスへのリクエストのみをキャッチすることに注意してください。

これでご質問への回答が得られたことを願いますが、次回は現在の設定に関する追加情報を入力して、調査を行ってください。

アップデート

説明した動作を得るには、地理モジュールで説明したようにこの質問:

geo $client {
    default web2;
    1.1.1.1 web1;
}
server {
    [...]
    root /srv/$client;
    [...]
}
この設定では、地理モジュールはクライアントのIPアドレスに基づいて変数($client)を設定します。その変数はデフォルトまたはウェブ2または特定のウェブ1そして、rootディレクティブ内で置き換えられます。

geoディレクティブはブロック内でhttpはなくブロック内に記述する必要があることに注意してくださいserver。上記のスニペットはそのまま動作するはずですが、テストしていないため保証はできません。

関連情報