
訪問者ホストが Nginx で特定のルート パスを使用するように設定するにはどうすればよいですか?
IP 1.1.1.1の訪問者は
root /srv/web1
他のすべての訪問者は
root /srv/web2
答え1
この質問は、少し調べてドキュメントを読むだけで簡単に答えられます(できれば初心者ガイドその後nginxがリクエストを処理する方法)、とにかく答えます。
複数のネットワーク インターフェイスと IP アドレスを持つサーバーがあり、1.1.1.1 アドレスが 1 つのインターフェイスに割り当てられ、他のアドレスがそれぞれのインターフェイスに割り当てられていると想定します。
Nginxはこの点で非常に柔軟です。実際、server
nginxが他のサーバーブロックと一致しない場合にデフォルトとして使用されるブロックが常に存在しますserver_name
。これはファイルの最初のブロックか、ディレクティブでserver
指定されているブロックです。覚えておいてください。default_server
listen
listen
ディレクティブで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
。上記のスニペットはそのまま動作するはずですが、テストしていないため保証はできません。