Eu finalmente consegui trabalhar usando a configuração abaixo
error_page 404 @proxy;
então
location @proxy {
rewrite ^ /viewer/index.html break;
proxy_pass http://s3-bucket-server;
}
Estou resolvendo isso há quase meio dia agora. : (
No Nginx em execução no meu laptop, onde não uso proxy_pass, os arquivos try estão funcionando bem. O aplicativo da Web JavaScript que eu escrevi faz o roteamento do cliente quando a página é carregada. No entanto, se a página da Web for atualizada, é o servidor que recebe a solicitação.
Eu tenho essa configuração no meu Nginx em execução no meu laptop
location /viewer {
try_files $uri /viewer/index.html;
}
Com a configuração acima, se eu solicitei o link que não existe no meu sistema de arquivos, serei exibido com / viewer / index .html Está funcionando muito bem!
No entanto, temos uma configuração diferente no trabalho. Todas as nossas páginas de arquivos estáticos / html são armazenadas em um bucket S3 upstream.
Esta é a nossa configuração de trabalho
location /viewer {
proxy_pass http://s3-bucket-server/viewer;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' $cors_header;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,Keep-Alive,User-Agent,Origin,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
A configuração acima funciona muito bem quando eu a acesso assim, http://internal-app.docs.svr/viewer
. Eu posso clicar em nossa navegação à esquerda, que muda o caminho da localização no lado do cliente para gostar
http://internal-app.docs.svr/viewer/settings
http://internal-app.docs.svr/viewer/docs
http://internal-app.docs.svr/viewer/permissions
etc
No entanto, se digamos que eu estava em http://internal-app.docs.svr/viewer/permissions
e cliquei no navegador, o que normalmente acontece é que ele faz uma chamada GET em / viewer / permissions em nosso servidor web internal-app.docs.svr. Infelizmente, não existe uma regra de localização nginx para lidar com isso.
O que eu gostaria de alcançar é que quando o cenário acima acontecer (a 404), tenha nginx serve /viewer/index.html. Eu não quero um redirecionamento desde que eu quero manter o último caminho que eu estava. Nesse caso, foi /viewer/permissions
. O aplicativo de JavaScript que eu escrevi lidará com /viewer/permissions
eventualmente.
Eu finalmente consegui trabalhar usando a configuração abaixo
error_page 404 @proxy;
então
location @proxy {
rewrite ^ /viewer/index.html break;
proxy_pass http://s3-bucket-server;
}