为什么 nginx default_server 屏蔽更好的匹配?

Cha*_*_99 4 nginx web-server dyndns

我得到了我的本地 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.

现在,该站点可从 Internet 访问,但突然其他站点之一在本地不再可用,无论是C还是C.domain,而是提供默认站点

有人知道为什么会这样吗?或者为什么 dyndns 域首先不匹配?或者如何设置访问日志以向我显示带有域字符串的请求站点?或者,也许是否有更好的方法将一个站点提供给 Internet,而将其他站点提供给本地站点?

站点A

server {
  listen 80;
  listen [::]:80;
  server_name A.domain, A; 
...
Run Code Online (Sandbox Code Playgroud)

站点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; 
...
Run Code Online (Sandbox Code Playgroud)

站点C

server {
   listen 80;

   server_name C, C.domain;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

更新删除 server_name 字段中的逗号使站点再次从本地 LAN 可用。但是从互联网上,只能domain.ddns.net:81连接到配置为default server. B.domain.ddns.net:81没有,虽然配置为server_name. 仍然欢迎更多帮助。

Ric*_*ith 9

server_name是完全匹配,除非您使用通配符或正则表达式语法。有关详细信息,请参阅此文档

该域B.domain.ddns.net与您现有的任何server_name表达式都不匹配,因此将改用默认服务器。

如果没有listendefault_server修饰符的指令,将使用第一个server块(具有匹配的 IP:PORT)。在不知道您的配置的加载顺序的情况下,我们不知道是哪一个(可能是站点 C,因为它神秘地停止了工作)。用nginx -T看到整个配置通过为已读nginx

server_name指令中没有逗号分隔符。您的站点 B 声明可能应该是:

server_name B.domain.ddns.net B.domain B;
Run Code Online (Sandbox Code Playgroud)