nginx reescreve apenas o nome do servidor específico para https

2

É sobre dois subdomínios. O primeiro (www) deve ser acessado via http. O segundo (nuvem) deve ser acessado via https.

Estas são as partes relevantes das minhas entradas:

server {
        listen 80;
        server_name cloud.example.de;
        rewrite ^ https://$server_name$request_uri? permanent;  # enforce https
}

server {
        listen 443 ssl;
        server_name cloud.example.de;
        root /home/user/web/cloud;
}

server {
        listen 80;
        server_name www.example.de;
        root /home/user/web/cms;

        #etc.
}

Quando eu faço agora o link , sou redirecionado para o link , tudo bem. Mas quando eu chamo o link também sou redirecionado para link , que me leva ao conteúdo de cloud.example.com, porque esse é o único nome de servidor definido como usado pela porta 443.

Não há entrada no log de acesso do subdomínio www.
Existe outro subdomínio apontando para um phpPgAdmin. Isso eu posso acessar normalmente, não é reescrito.

server {
        listen 80;
        server_name pgsql.example.de;
        root /home/user/web/phppgadmin;

        #etc
}

O que está faltando? A reescrita só deve ser feita se o nome do servidor corresponder a cloud.example.de .
E existe alguma relevância na ordem das entradas do servidor ou não importa?


Usando o nginx 0.8.54 no Ubuntu 11.04.

    
por 32bitfloat 20.03.2013 / 20:29

1 resposta

8

A configuração de amostra que você fornece parece correta, e eu duvido que funcionaria como você descreve (você provavelmente fez muitas mudanças ao tentar simplificá-la).

Você está recebendo redirecionamentos errados em algo como curl ou somente no navegador? Eu lidei com casos em que permanent está permanentemente em cache no Mozilla (por exemplo, de um nginx.conf anterior), sem nenhuma maneira de invalidar uma única entrada de cache 301 , então, você tem certeza de que não é um problema de cache? / p>

Em qualquer caso, você também pode tentar usar if para tornar os redirecionamentos condicionais (talvez o primeiro servidor seja escolhido como o servidor padrão):

    if ($host = "cloud.example.de") {
            rewrite ^ https://$server_name$request_uri? redirect;
    }
    return 403;

Ou, outra opção,

server {
    listen 80;
    listen 443 ssl;
    server_name cloud.example.de;
    if ($scheme != "https") {
        rewrite ^ https://$server_name$request_uri? redirect;
    }
    root /home/user/web/cloud;
}

E tente curl -v para garantir que você está vendo o que está lá.

    
por 20.03.2013 / 21:29