
我如何設定訪客主機使用 nginx 中的特定根路徑?
IP 1.1.1.1 的訪客將使用
root /srv/web1
所有其他訪客將使用
root /srv/web2
答案1
雖然這個問題很容易透過簡單地做一些研究和閱讀文件(最好從初學者指南進而nginx 如何處理請求),無論如何我都會回答。
我假設您有一台具有多個網路介面和 IP 位址的伺服器,其中 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 上的所有接口,而第二個區塊僅偵聽連接埠80 上的1.1.1.1 介面。造訪您網站的人將從/srv/web1接收文件,與HTTP請求中的Host欄位(即URL欄中寫入的網域名稱)無關。
另一種類似的行為可以透過將 IP 位址放入server_name
指令中來獲得,如下所示:
server {
listen 80;
server_name 1.1.1.1;
[...]
}
* 請注意,最後一個server
區塊僅捕獲對文字 IP 位址的請求,而不捕獲對網域名稱的請求。
我希望這能回答您的問題,但下次請提供有關您目前設定的更多資訊並進行一些研究。
更新
要獲得所描述的行為,您可以使用地理模組如中所解釋的這個問題:
geo $client {
default web2;
1.1.1.1 web1;
}
server {
[...]
root /srv/$client;
[...]
}
此配置使用地理$client
模組根據客戶端的 IP 位址設定變數 ( )。該變數被設定為預設值網路2或具體的網站1然後在root
指令中替換。
請注意,geo
指令必須位於http
區塊內而不是server
區塊內;上面的程式碼片段應該按原樣工作,但我不保證任何事情,因為我沒有測試它。