Шлюз Kong API v0.11.0 upstream_url

Мы пытаемся настроить плагин, который зависит от заголовков запроса, проксируя его на конкретный хост. Бывший.

curl -H 'Env: foo' http://127.0.0.1:8000/poc -> https://foo.example.com/poc
curl -H 'Env: bar' http://127.0.0.1:8000/poc -> https://bar.example.com/poc

В ранних версиях (‹v0.11.0) работал следующий код (это наш файл access.lua плагина):

local singletons = require "kong.singletons"
local responses = require "kong.tools.responses"

local _M = {}

function _M.execute(conf)
  local environment = ngx.req.get_headers()['Env']

  if environment then
    local result, err = singletons.dao.environments:find_all {environment = environment}


    if err then
      return responses.send_HTTP_INTERNAL_SERVER_ERROR(err)
    else
      ngx.ctx.upstream_url = result[1].proxy_redirect
    end

  end
end

return _M

Это сработало из-за того, что ngx.ctx.upstream_url перезаписал поведение proxy_pass.

Поскольку мы хотим использовать его в среде k8s, нам пришлось использовать версию 0.11.0, потому что они исправили некоторые проблемы, касающиеся DNS. Проблема, похоже, в том, что они изменили ngx.ctx.upstream_url на ngx.var.upstream_uri, но поведение не то же самое, он не меняет хост на прокси наш запрос. Это ошибка, которую мы получаем:

2017/08/23 11:28:51 [error] 22#0: *13 invalid port in upstream "kong_upstreamhttps://foo.example.com", client: 192.168.64.1, server: kong, request: "GET /poc HTTP/1.1", host: "localhost:8000"

У кого-нибудь есть такая же проблема? Есть ли другое решение нашей проблемы?

Заранее большое спасибо.


person fuentecilla86    schedule 23.08.2017    source источник


Ответы (1)


Вот так я решил эту проблему, если кому-то это интересно.

Наконец, я сделал перенаправление по заголовку «Host», и в своем плагине я изменил заголовок, чтобы он соответствовал другому api. Я имею в виду:

Я создал 2 API:

curl -H 'Host: foo' http://127.0.0.1:8000/ -> https://foo.example.com
curl -H 'Host: bar' http://127.0.0.1:8000/ -> https://bar.example.com

И поведение моего плагина должно быть таким:

curl -H 'Host: bar' -H 'Env: foo' http://127.0.0.1:8000/poc -> https://foo.example.com/poc
curl -H 'Host: foo' -H 'Env: bar' http://127.0.0.1:8000/poc -> https://bar.example.com/poc

Наиболее важным является то, что вы должны использовать в файле handler.lua контекст перезаписи вместо контекста доступа:

function ContextRedirectHandler:rewrite(conf)

  ContextRedirectHandler.super.rewrite(self)
  access.execute(conf)

end

А затем вы можете изменить заголовок «Host» в файле access.lua следующим образом:

local singletons = require "kong.singletons"
local responses = require "kong.tools.responses"

local _M = {}

function _M.execute(conf)
  local environment = ngx.req.get_headers()['Env']

  if environment then
    local result, err = singletons.dao.environments:find_all {environment = environment}

    if err then
      return responses.send_HTTP_INTERNAL_SERVER_ERROR(err)
    else
      ngx.req.set_header("Host", result[1].host_header_redirect)
    end

  end
end

return _M
person fuentecilla86    schedule 25.08.2017