インターネットからイントラネット内にあるサードパーティのアプリケーションにアクセスするためのリバースプロキシセットアップがあります。このアプリケーションが次のURLにあるとします。
https://internalserver:8080/
(イントラネットからのみアクセス可能)
プロキシはオンです:
https://proxyserver/
(世界中のどこからでもアクセス可能)
プロキシはnginxによって管理されており、正常に動作しています。ユーザーがhttps://proxyserver/
にアクセスすると、https://internalserver:8080/
でアプリのコンテンツを取得します。
問題は、アプリケーションがHTML応答に絶対URLを書き込んでいるため、ユーザーが新しいページへのリンクをクリックすると、ブラウザが内部名(例: https://internalserver:8080/somepage
ではなくhttps://proxyserver/somepage
。
これはプログラムのバグであることはわかっていますが、プログラムを変更することはできません。
応答を傍受し、URLを変更して、それを(変更された)nginxを使用して最終的なクライアントに送信できますか?または多分別のツールで?
編集:以前に この質問 を見ましたが、私のケースはより具体的です、引用された質問は一般的な変更を求めます。その場合、fast-cgiアドホックプログラムが最適なソリューションです。私が欲しいのは、より一般的なシナリオのより具体的なソリューション(と思います)です。 fast-cgiプログラムは機能しますが、私は最も簡単で強力なものを探しており、このシナリオの解決策を現実の世界で証明しています。
これは、インラインコンテンツリライティングを示すYouTubeの公式Nginxビデオです。
https://youtu.be/7Y7ORypoHhE?t=20m22s
確かにsub_filter
http://nginx.org/en/docs/http/ngx_http_sub_module.html
あなたの場合、あなたは次のようなものを見ています:
location / {
sub_filter_once off;
sub_filter_types text/html;
sub_filter "https://internalserver:8080" "https://proxyserver";
}
http://nginx.org/en/docs/http/ngx_http_sub_module.html
Ngx_http_sub_moduleモジュールは、指定された1つの文字列を別の文字列に置き換えることによって応答を変更するフィルターです。
このモジュールはデフォルトではビルドされません。--with-http_sub_module設定パラメーターで有効にする必要があります。
構成例
sub_filter </head> '</head><script language="javascript" src="$script"></script>';