web-dev-qa-db-ja.com

nginxリバースプロキシによって返されるHTMLページを変更する

インターネットからイントラネット内にあるサードパーティのアプリケーションにアクセスするためのリバースプロキシセットアップがあります。このアプリケーションが次の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プログラムは機能しますが、私は最も簡単で強力なものを探しており、このシナリオの解決策を現実の世界で証明しています。

19
PCJ

これは、インラインコンテンツリライティングを示す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";
}
18
JayMcTee

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>';
3
Voro