Прокси 404s в Kong API со статическим хостингом
У меня есть один экземпляр Kong, настроенный для обслуживания статического содержимого и API-интерфейсов из одного и того же экземпляра (с использованием Docker), я хочу иметь возможность маршрутизировать 404-и в статическом пути к пути API, определенному для настроенных конечных точек Kong, но переписать запрос.
Особенности заключаются в следующем:
- Я подаю статический контент в OpenResty, используя Kong, как описано здесь: https://getkong.org/docs/0.13.x/configuration/
- У меня есть маршрут, настроенный для API Kong в
/api
который проходит все маршруты, которые я установил. - Я получаю доступ к статическому контенту с использованием поддомена с подстановочными символами, который заканчивается как. глядя в //
У меня есть конечная точка, определенная как:
curl -d "name = sample_auth" \ -d "uris = / api / sample_auth" \ -d "upstream_url = http://mockbin.org/request" \ -k $ KONG_API / apis /
То, что я хочу сделать, это перенаправить 404 в моем статическом контенте на /api
путь, чтобы я мог размещать прокси приложения, которые размещают свой собственный контент, но не используют относительные пути.
Я пробовал пару вещей, которые еще не работали, такие как:
- С помощью
error_page 404 /api/$subdomain$uri;
в моем статическом месте- И используя
try_files $uri $uri/ =404;
- И используя
- так же
try_files $uri $uri/ @toprox;
- Где @toprox - это именованное местоположение, подобное приведенному ниже.
- И одна попытка, которая потерпела неудачу, использовала
try_files $uri $uri/ api/$subdomain$uri;
- (это просто не перенаправило на
/api
путь, только что вернул 404)
- (это просто не перенаправило на
При отладке этой проблемы я увидел, что когда /api
конечная точка была достигнута после 404 (либо через именованное местоположение, либо через обработчик 404), URI, казалось, был переписан правильно в соответствии с конфигурацией, но все еще возвращается как 404 (см. оператор отладки в конфигурации ниже)
Неудачный запрос (получение $KONG_API/)*********** UPSTREAM URI: URI: /api/sample_auth
Успешный запрос (получение $KONG_API/api/sample_auth):*********** UPSTREAM URI: /request URI: /api/sample_auth
Мой конфиг nginx выглядит примерно так:
location @toprox {
rewrite (.*)/* /api/$subdomain;
}
location / {
root /usr/share/nginx/html/$subdomain;
try_files $uri $uri/ @toprox;
expires off;
}
location /api {
set $upstream_host '';
set $upstream_upgrade '';
set $upstream_connection '';
set $upstream_scheme '';
set $upstream_uri '';
set $upstream_x_forwarded_for '';
set $upstream_x_forwarded_proto '';
set $upstream_x_forwarded_host '';
set $upstream_x_forwarded_port '';
proxy_intercept_errors on;
rewrite_by_lua_block {
kong.rewrite()
}
access_by_lua_block {
kong.access()
}
proxy_http_version 1.1;
proxy_set_header Host $upstream_host;
proxy_set_header Upgrade $upstream_upgrade;
proxy_set_header Connection $upstream_connection;
proxy_set_header X-Forwarded-For $upstream_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header X-Forwarded-Host $upstream_x_forwarded_host;
proxy_set_header X-Forwarded-Port $upstream_x_forwarded_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass_header Server;
proxy_pass_header Date;
proxy_ssl_name $upstream_host;
proxy_pass $upstream_scheme://kong_upstream$upstream_uri;
proxy_hide_header Access-Control-Allow-Origin;
proxy_hide_header Access-Control-Allow-Methods;
proxy_hide_header Access-Control-Allow-Credentials;
proxy_hide_header Access-Control-Allow-Headers;
header_filter_by_lua_block {
kong.header_filter()
}
body_filter_by_lua_block {
kong.body_filter()
}
log_by_lua_block {
kong.log()
ngx.log(ngx.DEBUG, "*********** UPSTREAM URI: " .. ngx.var.upstream_uri .. " URI: " .. ngx.var.uri);
}
}
location = /kong_error_handler {
internal;
content_by_lua_block {
kong.handle_error()
}
}