2013-08-26 8 views
5

私は次のパターンを働かせようとしています。あらかじめ定義されたいくつかのホストに切り替えるには、クライアント側のコードに動的パスを指定する必要があります。これらのホストは/ fwd/urlにエイリアスを追加してマップします。そして、サーバ設定の一部で、私はFWDで始まる任意のURLをキャッチし、マッピングされたエイリアス値を適用マップと正規表現を使用した動的proxy_pass

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

:エイリアスは、このようなnginxの実サーバにマッピングされています。エイリアスの後に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つの文字列に連結することはできません。任意のアイデアや同じ/簡単な方法を実現するには?

[EDIT]

は、私は前方という名前のクエリパラメータを使用することによって、これを実行する可能性がはるかに簡単な方法を発見しました。

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を返します。私は何が欠けていますか?

答えて

6

私は結局最初のアプローチに戻りました。なぜなら、これにURLにクエリパラメータを追加するのは便利ではないからです。クライアントロジックが不要になります。

私は最初のアプローチで解決策を見つけました。 locationステートメントの正規表現が間違っていました。正規表現を変数名でキャプチャする必要がありますか?

location ~ ^/fwd/(?<fwd_alias>\w+)/(?<fwd_path>.*)$ 

$ fwd_aliasには、fooやbarのようなエイリアスが含まれます。 $ fwd_pathにはそれ以降のパス全体が含まれています。それだ

proxy_pass http://$repo_url$fwd_path$is_args$args; 

:あなたにproxy_passを指定するオプションのクエリパラメータを含む完全なパスを渡すために

だから今、最初の例でのマッピングを含め、レゾルバを追加し、それがダウンしています:

location ~ ^/fwd/(?<fwd_alias>\w+)/(?<fwd_path>.*)$ { 
    resolver 8.8.8.8; 
    add_header Access-Control-Allow-Origin "*"; 
    proxy_pass http://$repo_url$fwd_path$is_args$args; 
    proxy_redirect off; 
    access_log on; 
} 

そして、次のパスと要求:

http://localhost:8080/fwd/foo/something/else?with=query 

マップへ:

http://foo.domain.nl/something/else?with=query 
+0

解決策の「完全な」コピーを投稿することができます。私はこれを(私ができる限り)続けているが、まだ404を得ている。 Alstublieft。 – Guy

1

私は正しい軌道に乗っていました。あなたは二つのことを行う必要があり、可変引数でproxy_pass使用したい場合は

  1. は、ホスト名を解決するために、レゾルバのステートメントを追加します。私が理解しているように、起動時にnginxはconfig内のすべてのドメイン名を検索し、それらをIPにマップします。私たちは可変ホスト名を使用しているので、nginxは設定を読み込むときにそれを調べることができず、DNSリゾルバを指定する必要があります。

  2. proxy_passで変数を使用する場合は、http://を追加する必要があります。それがなぜなのかわからない。

これは、その結果:

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

そして、それは働きます!:)

関連する問題