为什么 nginx default_server 屏蔽更匹配?

为什么 nginx default_server 屏蔽更匹配?

我让本地 nginx 为 3 个站点提供服务,具体配置如下。在我的本地局域网中,它们运行良好(dnsmasq 配置见下文),当使用A或者A.域。现在我希望其中一个网站可以通过 dyndns 域名从互联网访问,例如B.域名.ddns.net

我将路由器配置为将端口 81 转发(以免意外屏蔽路由器的管理界面)到本地服务器的端口 80,并在下面的示例中添加了当前注释掉的行(default_server 行除外)。

我进入了http://B.domain.ddns.net:81作为 URL。它不起作用。

我猜想子域名可能无法与 dyndns 系统兼容,因此我另外将一个站点设置为default_server

现在,该网站可以从互联网上访问,但突然其中一个其他网站在本地不再可用,也没有C也不C.域,而是使用默认的。

有人知道为什么会发生这种情况吗?或者为什么 dyndns 域名一开始就不匹配?或者我如何设置访问日志以显示带有域名字符串的请求站点?或者是否有更好的方法只将一个站点提供给互联网,而将其他站点提供给本地?

地点 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 serverB.domain.ddns.net:81虽然配置为 ,但不起作用server_name。仍欢迎提供更多帮助。

答案1

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;

相关内容