為什麼 nginx default_server 掩蓋了更好的匹配?
我讓我的本地 nginx 為 3 個站點提供了以下相應配置。當使用A或A.domain請求時,它們在我的本地 LAN 中執行良好(請參閱下面的 dnsmasq 配置)。現在,我希望通過諸如B.domain.ddns.net之類的 dyndns 域從 Internet 訪問其中一個站點。
我將路由器配置為將埠 81(以免意外屏蔽路由器的管理界面)轉發到本地伺服器的埠 80,並添加了以下範例中目前註釋掉的行,除了 default_server 行。
我輸入http://B.domain.ddns.net:81作為 URL。它沒有用。
我假設子域可能不適用於 dyndns 系統,所以我另外將一個站點設置為
default_server
.現在這使得該站點可以從網際網路上使用,但突然之間,其他站點之一不再在本地可用,無論是C還是C.domain,而是提供預設站點。
有人知道為什麼會這樣嗎?或者為什麼 dyndns 域首先不匹配?或者我如何設置訪問日誌以向我顯示帶有域字元串的請求站點?或者,如果有更好的方法可以將一個站點提供給 Internet,而將其他站點提供給本地?
站點 A
server { listen 80; listen [::]:80; server_name A.domain, A; ...
站點 B
server { listen 80; # used this instead of previous line after specific domain below didn't work # listen 80 default_server; listen [::]:80; server_name B.domain, B; #used this instead of previous for external access # server_name B.domain, B, B.domain.ddns.net; ...
站點 C
server { listen 80; server_name C, C.domain;
dnsmasq 配置
strict-order local=/heimatsender/ expand-hosts domain=heimatsender log-queries dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,168h log-dhcp dhcp-option=option:router,192.168.1.1 dhcp-hostsfile=/etc/dnsmasq-dhcphosts dhcp-option=15,"domain" dhcp-option=6,192.168.1.18 cname=A.domain,A cname=A.domain.domain,A.domain cname=Aalias,A cname=Aalias.domain,A.domain cname=C,A cname=C.domain,A.domain cname=B,A cname=B.domain,A.domain
更新刪除 server_name 欄位中的逗號使站點再次可從本地 LAN 使用。但從網際網路上,只能
domain.ddns.net:81
連接到配置為default server
.B.domain.ddns.net:81
沒有,雖然配置為server_name
. 仍然歡迎更多幫助。
server_name
是完全匹配的,除非您使用萬用字元或正則表達式語法。有關詳細資訊,請參閱此文件。該域
B.domain.ddns.net
與您現有的任何表達式都不匹配server_name
,因此將使用預設伺服器。如果沒有
listen
帶有default_server
修飾符的指令,將使用第一個server
塊(具有匹配的 IP:PORT)。在不知道您的配置的載入順序的情況下,我們不知道是哪一個(可能是站點 C,因為它神秘地停止了工作)。用於nginx -T
查看由 讀取的整個配置nginx
。
server_name
指令中沒有逗號分隔符。您的站點 B 聲明應該是:server_name B.domain.ddns.net B.domain B;