いくつかの内部Webサービスの前にリバースプロキシを配置しようとしています。
Nginxはセットアップされ、リクエストに応えるために適切に機能しています。 1つのみを提供する場合location /
私のconfファイルでは、proxy_passターゲットが正常にロードされます。つまり、
location / {
proxy_pass https://internal.ip:port/;
}
https:// public_proxy_address / にアクセスすると、その内部リソースが完全に読み込まれます。
しかし、私は複数の内部アプリケーションを持っているので、nginxを介してそれらすべてをプロキシしたいと思います。したがって、私のテストでは、confを次のように変更しました。
location /app1 {
proxy_pass https://internal.ip:port/;
}
これを実行すると、メイン/デフォルトの内部アプリインデックスページが表示されますが、ソースを表示すると、リンクスタイルシート、js、またはその他のリソースが書き換えられていないことがわかります。したがって、ページのコンテンツ全体がロードに失敗します。 Apacheでは、おそらくproxyhtmlurlmap ^/resource/ /app1/resource R
。私はnginxでこれを達成する方法を見つけることができません。
私もこれを試しましたが、役に立ちませんでした:
location /app1 {
rewrite /resource(.*?) /app1/resource$1 break;
proxy_pass https://internal.ip:port/;
}
NginxがリクエストされたリソースのURLにターゲットの場所(app1)を適切に付加してロードできるようにするにはどうすればよいですか?
クレジットが足りないので、コメントはできませんので、別のエントリーで返答します。
OPが同意しない理由はわかりませんが、Martin Fjordvalが問題を正しく識別し、正しいことを提案していると思います。以下のように彼のスニペットを少し変更することをお勧めします。
location /app1/ {
proxy_set_header Host $http_Host/app1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
add_header Pragma "no-cache";
add_header Cache-Control "no-cache";
proxy_pass http://internal.ip:port/;
sub_filter 'action="/' 'action="/app1/';
sub_filter 'href="/' 'href="/app1/';
sub_filter 'src="/' 'src="/app1/';
sub_filter_once off;
}
したがって、「/」で始まるすべての相対URLにリダイレクトが必要であると確信している場合、上記はすべてに「/ app1 /」を追加し、参照時に「location/app1 /」ブロックにキャッチされます。次に、ページのソースを表示して、書き換えが行われていることを確認できます。
また、おそらく「proxy_set_header」シャバンの全体または少なくとも一部、特に「proxy_set_header Host $ http_Host/app1」ビットが必要です。
私があなたの問題を正しく理解している場合、問題はアプリケーションがルートuriでホストされていると考えているようです/
が実際にホストされている間/app1
と言われていません。 Nginxは通常、期待どおりのバックエンドの応答を変更しませんが、それは可能です。
最初に、アプリにルートURIを定義できる構成オプションがあるかどうかを確認します。設定がある場合、それは断然最も簡単な解決策です。
何も見つからない場合は、 substitution module を使用して、HTMLのURLを置き換えることができます。これを機能させるには、バックエンドでGZIPエンコーディングを無効にする必要があることに注意してください。これにより、nginxは圧縮されていないHTMLを見ることができます。
サブフィルターがどのように見えるかの例
location /app1 {
sub_filter '<a href="/resource/' '<a href="/app1/resource/';
sub_filter_once off;
proxy_pass https://internal.ip:port/;
}
私はサブドメインベースのプロキシを使用することになりました。基本は次のようになります。
server {
listen 443 ssl;
ssl on;
ssl_cert <cert>;
ssl_key <key>;
server_name appname1.public.com;
location / {
proxy_pass https://internalapp1.ip:port
}
}
server {
listen 443 ssl;
ssl on;
ssl_cert <cert>;
ssl_key <key>;
server_name appname2.public.com;
location / {
proxy_pass https://internalapp2.ip:port
}
}
これにより、URLやリソースを直接書き換える必要がなくなります。
ページのURLおよびページが使用するすべてのリソースではなく、場所に単一の絶対URLを指定しました。そのURLで始まる正規表現を指定する必要があります。このようなものはうまくいくかもしれません(私はそれをテストしていません)
location ~ /app1(/.*) {
proxy_pass https://internal.ip:port/;
}