Nginx

為什麼 nginx default_server 掩蓋了更好的匹配?

  • September 28, 2018

我讓我的本地 nginx 為 3 個站點提供了以下相應配置。當使用AA.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;

引用自:https://serverfault.com/questions/933077