NGINX redireciona todos os domínios para um, mas não para os endereços IP públicos e privados do próprio servidor

3

Não consegui encontrar uma pergunta que corresponda ao meu cenário específico, portanto, espero que isso não seja uma duplicação. Se for o caso, peço desculpas.

Eu tenho 4 servidores da web por trás de um balanceador de carga. Eu quero apenas www.mydomain.com, 123.123.123.123 (endereço IP público do meu servidor) e 456.456.456.456 (endereço IP da rede interna do meu servidor) para funcionar, qualquer outra coisa deve redirecionar para www.mydomain.com.

Por que: preciso enviar tudo para www.mydomain.com porque tivemos pessoas configurando outros domínios (www.otherdomain.com) apontando para nosso endereço IP, para que ele funcione como um espelho do nosso site. Não sabemos por que eles fazem isso, mas o Google começa a indexar o site como se fosse um site totalmente diferente e causa problemas. Eu preciso permitir que os endereços IP do servidor sejam usados porque usamos isso para a conversação interna do servidor por meio de uma API personalizada, para contornar o balanceador de carga.

As únicas soluções que consegui encontrar foram redirecionar tudo, INCLUINDO os endereços IP para www.mydomain.com, ou eles acabaram redirecionando nada.

Aqui está minha configuração atual (truncada por simplicidade):

server {
    listen 80;
    server_name www.mydomain.com 123.123.123.123 456.456.456.456;
}

server {
    listen 80 default;
    server_name _;
    rewrite ^ http://www.mydomain.com$request_uri?;
}

Esperado: as solicitações para o domínio correto ou para o endereço IP correspondem à primeira regra. Todas as outras solicitações correspondem à segunda regra e são redirecionadas. Real: Nada é redirecionado, estou assumindo porque o NGINX está apenas combinando o endereço IP, independentemente do domínio, com a primeira regra. Também pode ser possível que o balanceador de carga esteja estragando tudo? Estou usando um balanceador de carga em nuvem da Rackspace, se isso ajudar.

Eu também tentei esta configuração:

server {
    listen 80 default;
    server_name www.mydomain.com;
}

server {
    listen 80;
    server_name _;
    rewrite ^ http://www.mydomain.com$request_uri?;
}

Isso tem os mesmos resultados que o anterior. Nada parece ser redirecionado.

Alguma idéia de como posso corrigir isso?

Obrigado pela sua ajuda!

    
por Matt 26.12.2012 / 23:51

2 respostas

1

Eu consegui trabalhar. Sameer estava perto, mas não tenho certeza se ele entendeu minha pergunta exata. Esta é a solução para o meu problema;

server {
    listen 80;
    server_name www.mydomain.com 123.123.123.123 456.456.456.456;
}

server {
    listen 80 default_server;
    server_name _;
    rewrite ^ http://www.mydomain.com$request_uri?;
}

Com os itens acima, você pode carregar o site por meio de www.mydomain.com, ou os endereços IP internos e públicos diretos, mas se você tentar carregá-lo de qualquer outra forma redirecionada.

Curiosamente ... Este é o primeiro exemplo que eu tentei acima. Eu não sei porque não funcionou e agora está funcionando. Talvez porque o "listen 80 default" tenha sido preterido em favor de "listen 80 default_server". Ou talvez eu tenha confundido as coisas testando em todos os 4 nós. De qualquer forma, parece estar funcionando agora com essa definição!

    
por 28.12.2012 / 08:39
0
server {
    listen 456.456.456.456:80;
    server_name mydomain.com;
    # I am more lenient with internal and this will bypass the LB
}

server {
    listen 80 default;
    server_name _;
    if ($host != www.mydomain.com){
        rewrite ^ http://www.mydomain.com$request_uri?;
    }
}

Se o interno e o externo não forem diferentes, você poderá acabar com a primeira seção do servidor. Idealmente, você deve se preocupar apenas com o cabeçalho $ host, que é um cabeçalho HTTP padrão. Com o loadbalancer HTTP você deve usar o IP do balanceador de carga e não o IP público da sua máquina porque isso irá desviar o LB.

    
por 27.12.2012 / 05:38