2017-08-23 10 views
4

リクエストのヘッダーに依存するプラグインを設定し、特定のホストにプロキシをプロキシしようとしています。 Ex。これは、ngx.ctx.upstream_urlによる働いKong APIゲートウェイv0.11.0 upstream_url

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 

:初期のバージョン(< v0.11.0)次のコードでは、働いていた(これはプラグインの私達のaccess.luaファイルである)で

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 

がproxy_pass動作を上書きしました。

k8s環境で使用したいので、dnsに関するいくつかの問題を修正したので、0.11.0バージョンを使用しなければなりませんでした。問題はそれらが変更されているように思われる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" 

誰も同じ問題がありますか?私たちの問題に他の解決策がありますか?

ありがとうございます。

答えて

2

これは、誰かが興味を持っている場合、私がこの問題を解決した方法です。

最後に、私は "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 

最も重要と思うあなたはハンドラ内で使用すべきであるということです。アクセスコンテキストの代わりに書き換えコンテキストをファイルに書き込む:

function ContextRedirectHandler:rewrite(conf) 

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

end 

そして、あなたは "ホスト"を変更することができますあなたのaccess.luaファイルのaderは次のようになります:

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 
関連する問題