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;
}
}