Я пытаюсь переместить прокси-сервер моего узла с порта 8080
к 80
и ударяя по стенам. Я хочу, чтобы мой RESTful API находился за обратным прокси-сервером nginx, прослушивающим порт 80 на месте /api/path
вместо.
(Порт 8080
был недоступен для некоторых корпоративных пользователей за чрезмерно усердными брандмауэрами.)
Раньше я направлял запросы на https: //domain.tld: 8080 / к http: // локальный: 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;
}
}
Теперь я пытаюсь переместить его на место 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;
}
}
Это приводит к:
$ 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
Теперь я прочитал, что вы не можете выполнять POST на статические страницы, что означает, что вы делаете что-то вроде:
error_page 405 @405;
location = @405 {
root /path/to/html/;
}
Но поскольку я не могу найти достаточно информации об этом, он не работает. 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;
}
}
Если вы хотите указать /api/path/
в корень места назначения перенаправления вам необходимо использовать:
proxy_redirect http://localhost:1337 https://domain.tld/api/path/