変数を含む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
この場合、/home
はhttps://a.blahblah.com/home
から提供されるコンテンツです。
それはうまくいきません。
私が正しく理解している場合は、後続のリクエストで同じホストにプロキシする必要があります。 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 /以降はホスト名としてカウントされます!
( http:// localhost:8080/proxy )はexample.comにプロキシします。まだ設定のどこかにない場合、動的ルックアップ用のリゾルバーを追加しました。プロキシリクエストのHostヘッダーを、リクエストされたものに設定する必要があります。
お役に立てれば。リダイレクトブードゥーは別のトピックです
リゾルバーなしでproxy_passのURLで変数を使用することは、nginx-plus(商用バージョン)でのみ使用できます
リゾルバーを追加することは、URLを理解するDNSを指すようにすることを意味します。
私はこれを無料バージョンで動作させるために長い間試しました:
proxy_pass http://$myvariable:8081;
これは、nginxの「支払い」の言い方です。
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;
}