Nginx - A lógica do cookie de redirecionamento causa erros 404

1

Eu tenho a seguinte configuração:

upstream ring {
    server 127.0.0.1:3000 fail_timeout=0;
}

server {

    root /home/app/public;

    index index.dev.html;

    server_name localhost;

    location / {
        try_files $uri $uri/ @ring;
    }

    location @ring {
        proxy_pass http://ring;
        proxy_set_header Host $http_host;
        proxy_buffering off;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Ele serve como um arquivo, depois diretório e, em seguida, faz o proxy para o servidor de aplicativos. Isso funciona como esperado. No entanto, agora, desejo redirecionar o usuário para uma página about.html na PRIMEIRA vez que visitarem o site. Então eu mudei a configuração para o seguinte:

upstream ring {
    server 127.0.0.1:3000 fail_timeout=0;
}

server {

    root /home/app/public;

    index index.dev.html;

    server_name localhost;

    location / {

        set $seen false;

        if ($http_cookie ~* "seen") {
           set $seen true;
        }

        if ($seen = false) {
           add_header Set-Cookie seen=1;
           return 302 $scheme://$host/about.html;
        }

        try_files $uri $uri/ @ring;
    }

    location @ring {
        proxy_pass http://ring;
        proxy_set_header Host $http_host;
        proxy_buffering off;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

A lógica de redirecionamento agora funciona (nenhum cookie redireciona para about.html com um novo conjunto de cookies, as solicitações subseqüentes passam para a página principal index.html). MAS, agora qualquer URL para o servidor de aplicativos resulta em erros 404. O local de @ring não está mais sendo servido.

Eu provavelmente estou cometendo um erro bobo, mas não entendo bem o nginx para depurar isso.

Muito obrigado.

    
por Scott 24.11.2015 / 20:42

1 resposta

0

Ok, acontece que "se é mal" no nginx ( link ) , e que isso é um bug devido a "if" ser imperativo e o resto da configuração sendo declarativo.

A seguinte alteração funciona e faz tudo o que eu queria. O truque não é fazer nada dentro de um if além de retornar ou reescrever. E, em seguida, também para usar o código de redirecionamento interno nginx de 418.

upstream ring {
    server 127.0.0.1:3000 fail_timeout=0;
}

server {

    root /home/app/public;

    index index.dev.html;

    server_name localhost;

    location / {

        error_page 418 = @about;

        if ($cookie_seen != 1) {
          return 418;
        }

        try_files $uri $uri/ @ring;
    }

    location @about {
        add_header Set-Cookie seen=1;
        return 302 $scheme://$host/about.html;
    }

    location @ring {
        proxy_pass http://ring;
        proxy_set_header Host $http_host;
        proxy_buffering off;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}
    
por 24.11.2015 / 21:54

Tags