web-dev-qa-db-ja.com

リダイレクト間の変数を持つnginx動的proxy_pass

変数を含むNginx proxy_passは理解しにくいです。誰かが以下のシナリオをどのように達成するかを説明できますか?.

#first call /?proxytohost=http://blahblah.com
#second redirection to /
#third call /home 

location / {
    if ($arg_proxytohost) {
        set $proxytohost $arg_proxytohost;
        rewrite ^.*$ / break;
    }

    proxy_pass https://$proxytohost;   #first call it may recognize, third call definitely it cant

    proxy_intercept_errors on;
    error_page 301 302 307 = @handle_redirects;
}

location @handle_redirects {
    set $saved_redirect_location '$upstream_http_location';
    proxy_set_header  Host $proxy_Host;
    proxy_pass $proxytohost$saved_redirect_location;   #this has proxytohost, i dont think it can recognize the variable here
}

編集:

動的ないくつかのインスタンス(a.blahblah.com、b.blahblah.comなど)をリバースプロキシしたかった。これらの各サービスインスタンスには、Cookieを格納してリダイレクトする必要がある複数のリダイレクトがあります(そのため、@ handle_redirectsセクションがあります)。

変数$proxytohostをロケーション宣言の上にa.blahblah.comとして設定すると、期待どおりに機能します。

しかし、その$proxytohostを動的な引数として最初のリクエストに送信し、それを変数に設定してからproxy_passしたい場合、機能しません。

たとえば、nginxがlocalhost:8080で実行されていると仮定すると、これが私の期待です

下にカールした場合

http://localhost:8080/?proxytohost=a.blahblah.com?authToken=aksdfkj

認証にトークンを使用してホームページにリダイレクトすると、ホームページに移動します。

http://localhost:8080/home

この場合、/homehttps://a.blahblah.com/homeから提供されるコンテンツです。

2
raksja

それはうまくいきません。

私が正しく理解している場合は、後続のリクエストで同じホストにプロキシする必要があります。 Nginxは互いに独立してリクエストを処理します。したがって、2番目と3番目のリクエストでは、$arg_proxytohostはなく、指定したデフォルトが使用されます。

これにはCookieを使用することをお勧めします。以下の小さな例。

これはhttp {}にある必要があり、別のファイルのconf.dにある可能性があります

map $cookie_p_Host $p_Host {
    default $cookie_p_Host;
    ""      $Host;
}

次に、サーバーに接続する場所があります{}

location ~ /proxy/sethost/(?<p_Host>.*) { 
    add_header Set-Cookie 'p_Host=$p_Host;path=/proxy'; 
    add_header Content-type text/html; 
    return 200 'cookie was "$cookie_p_Host"<br>now set to "$p_Host"'; 
}

location   ~ /proxy(?<p_uri>.*) { 
    resolver         8.8.8.8 ; 
    resolver_timeout 5s; 
    proxy_set_header Host $p_Host; 
    proxy_pass       http://$p_Host$p_uri; 
}

使い方/説明:

マッピング

マッピングは、厄介なifステートメントを回避するために使用されます。 Cookieが設定されている場合は、ホスト名として使用されます(正しいかどうか、チェックもケアもしません)。設定されていない場合(null /空)、$ Host変数を使用します。それを好きなように変更できます。

最初の場所

http:// localhost:8080/proxy/sethost/example.com )は、ホストがexample.comに設定されたCookieを設定します。/proxy/sethost /以降はホスト名としてカウントされます!

2番目の場所

http:// localhost:8080/proxy )はexample.comにプロキシします。まだ設定のどこかにない場合、動的ルックアップ用のリゾルバーを追加しました。プロキシリクエストのHostヘッダーを、リクエストされたものに設定する必要があります。

お役に立てれば。リダイレクトブードゥーは別のトピックです

3
evilBunny

リゾルバーなしでproxy_passのURLで変数を使用することは、nginx-plus(商用バージョン)でのみ使用できます

リゾルバーを追加することは、URLを理解するDNSを指すようにすることを意味します。

私はこれを無料バージョンで動作させるために長い間試しました:

proxy_pass http://$myvariable:8081;

これは、nginxの「支払い」の言い方です。

0
user507001

Ifディレクティブをロケーションブロックの外側に変更すると、同じ意味になります。

if ($arg_proxytohost) {
    set $proxytohost $arg_proxytohost;
    rewrite ^.*$ / break;
}
location / {
proxy_pass https://$proxytohost;   #first call it may recognize, third call definitely it cant

proxy_intercept_errors on;
error_page 301 302 307 = @handle_redirects;

}

0
Ilham Sulaksono