Configuração Nginx para a API Restful por trás do proxy

3

Estou tentando mover meu proxy de nó da porta 8080 para 80 e atingir paredes. Eu quero que minha API RESTful esteja por trás de um proxy reverso nginx ouvindo na porta 80 no local /api/path .

(a porta 8080 não era acessível para alguns usuários corporativos por trás de firewalls com excesso de zelo).

Eu costumava direcionar solicitações para o link para link . Sem problemas via:

server {
    listen      8080;
    server_name  domain.tld;

    ssl on; #some other SSL config removed for clarity

    location / {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

Agora estou tentando movê-lo para o local api/path/ e para longe da porta 8080 via:

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  domain.tld;
    root         /path/to/html/;

    ssl on; #some other SSL config removed for clarity

    location /api/path/ {
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}

Isso resulta em:

$ curl -i -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{}' https://domain.tld/api/path

TTP/1.1 404 Not Found
Date: Thu, 08 Sep 2016 01:29:35 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 25
Connection: keep-alive
X-Powered-By: Express
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains;

Cannot POST /api/path

Agora eu li que você não pode postar em páginas estáticas, o que significa que você faz algo como:

error_page  405          @405;

location = @405 {
    root         /path/to/html/;
}

Mas, como não consigo encontrar informações suficientes sobre isso, não está funcionando. GET funciona normalmente, mas o POST irá cometer erros com Cannot POST api/path . O que posso fazer aqui?

Aprecie qualquer ajuda.

Atualizar

Eu precisava ativar o proxy_redirect como @techraf apontou para que minha configuração bem-sucedida seja assim agora. Espero que ajude alguém.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  domain.tld;
    root         /path/to/html/;

    ssl on; #some other SSL config removed for clarity

    location /api/path/ {
        proxy_redirect          http://localhost:1337/  /api/path/; #<-- change
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass              http://127.0.0.1:1337;
    }
}
    
por Dominik 08.09.2016 / 03:58

1 resposta

1

Se você quiser apontar /api/path/ para a raiz do seu destino de redirecionamento, será necessário usar:

proxy_redirect http://localhost:1337 https://domain.tld/api/path/
    
por 08.09.2016 / 04:21