代理背后的 Restful API 的 Nginx 配置

Dom*_*nik 6 nginx reverse-proxy

我正在尝试将我的节点代理从端口移动808080墙壁并撞墙。我希望我的 RESTful API 位于监听端口 80 的 nginx 反向代理之后/api/path

8080某些企业用户在过度热情的防火墙后面无法访问端口。)

我曾经将请求指向https://domain.tld:8080/http://localhost:1337。没有问题通过:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我试图通过以下方式将它移动到位置api/path/并远离端口8080

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这导致:

$ 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
Run Code Online (Sandbox Code Playgroud)

现在我读到您不能发布到静态页面,这意味着您可以执行以下操作:

error_page  405          @405;

location = @405 {
    root         /path/to/html/;
}
Run Code Online (Sandbox Code Playgroud)

但由于我找不到足够的信息,它不起作用。GET 正常工作,但 POST 会出错Cannot POST api/path。我能在这里做什么?

感谢任何帮助。

更新

我需要启用proxy_redirect@techraf 指出的那样我的成功配置现在看起来像这样。希望它可以帮助某人。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

tec*_*raf 2

如果您想指向/api/path/重定向目标的根目录,则需要使用:

proxy_redirect http://localhost:1337 https://domain.tld/api/path/
Run Code Online (Sandbox Code Playgroud)