Por que o nginx default_server mascara uma correspondência melhor?

4

Eu tenho o meu nginx local para veicular 3 sites com as respectivas configurações abaixo. Eles funcionaram bem assim na minha LAN local (veja abaixo também para a configuração dnsmasq) quando solicitado com A ou A.domain . Agora eu queria que um desses sites estivesse disponível na internet através de um domínio dyndns como B.domain.ddns.net .

Configurei meu roteador para a porta 81 encaminhada (para não mascarar acidentalmente a interface de administração do roteador) na porta 80 do meu servidor local e adicionei as linhas atualmente comentadas nos exemplos abaixo, exceto a linha default_server.

Eu inseri o link como URL. Não funcionou.

Eu supus que talvez o subdomínio de alguma forma não funcione com o sistema dyndns, então eu configurei adicionalmente um site para default_server .

Agora que disponibilizou o site a partir da Internet, mas de repente um dos outros sites já não está disponível localmente, nem com C nem com C.domain , em vez disso padrão é servido.

Alguém sabe por que isso acontece? Ou porque o domínio dyndns não combina em primeiro lugar? Ou como posso definir o log de acesso para me mostrar o site solicitado WITH a cadeia de domínio? Ou talvez se há uma maneira melhor de servir apenas um site para a internet e os outros localmente?

Site A

server {
  listen 80;
  listen [::]:80;
  server_name A.domain, A; 
...

Site 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; 
...

Site C

server {
   listen 80;

   server_name C, C.domain;

dnsmasq-config

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

Atualizar A remoção das vírgulas no campo server_name tornou os sites disponíveis na LAN local novamente. Mas da internet, apenas domain.ddns.net:81 trabalha para se conectar ao site configurado como default server . B.domain.ddns.net:81 não, embora configurado como server_name . Mais ajuda ainda bem-vindo.

    
por Chaos_99 28.09.2018 / 09:22

1 resposta

9

A server_name é uma correspondência exata, a menos que você use curingas ou uma sintaxe de expressão regular. Consulte este documento para detalhes.

O domínio B.domain.ddns.net não corresponde a nenhuma das expressões server_name existentes, portanto, o servidor padrão será usado.

Se não houver uma diretiva listen com um modificador default_server , o primeiro bloco server (com IP: PORT correspondente) será usado. Sem conhecer a ordem de carga da sua configuração, não sabemos qual deles foi (possivelmente o site C, pois ele misteriosamente parou de funcionar). Use nginx -T para ver toda a configuração como lida por nginx .

Não há separador de vírgula na diretiva server_name . Sua declaração do site B talvez seja:

server_name B.domain.ddns.net B.domain B;
    
por 28.09.2018 / 10:31