Proxy reverso Nginx e uma reescrita de URL

Proxy reverso Nginx e uma reescrita de URL

Gostaria de reescrever o URL em um proxy reverso para que ele remova o primeiro segmento, mas deixe intactos os segmentos seguintes. Preciso que isso aconteça antes de atingir a passagem do proxy.

Exemplo:

/admin/auth/local ----> (REWRITES TO) /auth/local
/admin/auth/register -------> (REWRITES TO) /auth/register

Bloco Meu local:

  location /admin {
        #add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass_header Set-Cookie;
        proxy_read_timeout                 30;
        proxy_buffers 64 8k;
        rewrite /admin / break;
        proxy_pass http://127.0.0.1:9000;

Eu tentei o seguinte sem sorte:

rewrite /admin / break;

Responder1

Existem duas partes aqui. A primeira é como o nginx roteia as solicitações recebidas via proxy_pass.

Lá é possível mapear solicitações recebidas para /backend com /admin/prefixo com a seguinte configuração:

location / {
    proxy_pass http://127.0.0.1:9000/admin/;
}

Nenhuma rewritedeclaração é necessária.

A segunda parte são os URLs gerados pelo aplicativo em execução 127.0.0.1:9000. Você precisa configurar esse aplicativo para gerar URLs sem o /adminprefixo para ter URLs que correspondam à configuração de roteamento nginx.

O Nginx não pode fazer essa alteração de maneira confiável no conteúdo gerado pelo back-end.

Responder2

Acredito que você só precisa adicionar seu primeiro segmento (admin) ao passe do proxy.

proxy_pass http://www.example.com/admin/;

Responder3

Você pode tentar o seguinte trecho. Funciona para mim.

location ~* /admin/(.*) {
  ...
  rewrite .* /$1 break;
  proxy_pass http://127.0.0.1:9000;
}

(.*)da primeira linha é recuperada no bloco como $1. A ideia é recuperar o URI depois admin/e substituir tudo por esse URI.

informação relacionada