6

次のパターンを機能させようとしています。いくつかの事前定義されたホストに切り替えることができるように、クライアント側のコードで動的パスを指定する必要があります。/fwd/ URL にエイリアスを追加して、これらのホストをマップします。エイリアスは、次のように nginx の実サーバーにマップされます。

map $uri $repoUrl {
    default             invalid;
    ~^/fwd/foo/.*        http://foo.domain.nl/;
    ~^/fwd/bar/.*        http://bar.domain.nl/;
  }

次に、サーバー構成部分で、fwd で始まるすべての URL をキャッチし、マップされたエイリアス値を適用します。エイリアスの後の URL の残りの部分も、URL に追加する必要があります。

location /fwd/(\w+)/(.*)$ {
  add_header X-FwdHost "$repoUrl$2";
  add_header Access-Control-Allow-Origin "*";
  proxy_pass         "$repoUrl$2";
  proxy_redirect off;
  access_log on;
}

これを次のようにテストすると:

curl -i http://localhost:8080/fwd/foo/something/else

私は得る:

X-FwdHost: http://foo.domain.nl/

しかし、正規表現の結果をテストすると、次のようになります。

 $1: foo
 $2: something/else

したがって、全体としては機能しているようです。正規表現は問題ないように見えますが、1 つの文字列に連結できませんか? アイデアはありますか、それとも同じことを達成するためのより簡単な/より良い方法はありますか?

[編集]

forward という名前のクエリ パラメータを使用することで、これを行うためのおそらくはるかに簡単な方法を見つけました。まず、クエリ パラメータを適切なホストにマップします。

map $arg_forward $repo_forward {
default           http://invalid_repo_forward/;

foo              http://foo.domain.nl/;
bar              http://bar.domain.nl/;

}

次に、転送するパスでパラメーターを使用します。

location /fwd/ {
  add_header X-FwdHost $repo_forward;
  add_header Access-Control-Allow-Origin "*";
  proxy_pass         $repo_forward;
  proxy_redirect off;
  access_log on;
}

私は期待し、URLは次のようになります:

http://localhost:8080/fwd/?forward=foo

結果として:

http://foo.domain.nl/

...しかし、まだこれは機能しません。404 が返ってきます。私は何が欠けていますか?

4

2 に答える 2